From 860d79a2d05bce4635bfe64541864ab177140b38 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Thu, 4 Jan 2024 22:13:40 -0600 Subject: [PATCH 01/30] pipettes! --- src/main/java/com/hbm/items/ModItems.java | 11 ++ .../java/com/hbm/items/tool/ItemPipette.java | 171 ++++++++++++++++++ src/main/resources/assets/hbm/lang/en_US.lang | 3 + .../assets/hbm/textures/items/pipette.png | Bin 0 -> 186 bytes .../hbm/textures/items/pipette_overlay.png | Bin 0 -> 159 bytes 5 files changed, 185 insertions(+) create mode 100644 src/main/java/com/hbm/items/tool/ItemPipette.java create mode 100644 src/main/resources/assets/hbm/textures/items/pipette.png create mode 100644 src/main/resources/assets/hbm/textures/items/pipette_overlay.png diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 30d2e7b34..d402c03ef 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -935,6 +935,9 @@ public class ModItems { public static Item fluid_barrel_full; public static Item fluid_barrel_empty; public static Item fluid_barrel_infinite; + public static Item pipette; + public static Item pipette_boron; + public static Item pipette_laboratory; public static Item disperser_canister_empty; public static Item disperser_canister; @@ -4652,6 +4655,9 @@ public class ModItems { fluid_barrel_empty = new Item().setUnlocalizedName("fluid_barrel_empty").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":fluid_barrel"); fluid_barrel_full = new ItemFluidTank().setUnlocalizedName("fluid_barrel_full").setContainerItem(ModItems.fluid_barrel_empty).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":fluid_barrel"); fluid_barrel_infinite = new ItemInfiniteFluid(null, 1_000_000_000).setUnlocalizedName("fluid_barrel_infinite").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":fluid_barrel_infinite"); + pipette = new ItemPipette().setUnlocalizedName("pipette").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pipette"); + pipette_boron = new ItemPipette().setUnlocalizedName("pipette_boron").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pipette_boron"); + pipette_laboratory = new ItemPipette().setUnlocalizedName("pipette_laboratory").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pipette_laboratory"); disperser_canister_empty = new Item().setUnlocalizedName("disperser_canister_empty").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":disperser_canister"); disperser_canister = new ItemDisperser().setUnlocalizedName("disperser_canister").setContainerItem(ModItems.disperser_canister_empty).setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":disperser_canister"); @@ -6382,6 +6388,11 @@ public class ModItems { GameRegistry.registerItem(fluid_barrel_full, fluid_barrel_full.getUnlocalizedName()); GameRegistry.registerItem(fluid_barrel_infinite, fluid_barrel_infinite.getUnlocalizedName()); + //Pipette + GameRegistry.registerItem(pipette, pipette.getUnlocalizedName()); + GameRegistry.registerItem(pipette_boron, pipette_boron.getUnlocalizedName()); + GameRegistry.registerItem(pipette_laboratory, pipette_laboratory.getUnlocalizedName()); + //Disperser Canister GameRegistry.registerItem(disperser_canister_empty, disperser_canister_empty.getUnlocalizedName()); GameRegistry.registerItem(disperser_canister, disperser_canister.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/tool/ItemPipette.java b/src/main/java/com/hbm/items/tool/ItemPipette.java new file mode 100644 index 000000000..9ca02b46a --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemPipette.java @@ -0,0 +1,171 @@ +package com.hbm.items.tool; + +import api.hbm.fluid.IFillableItem; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import com.hbm.items.ModItems; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import java.util.List; + +public class ItemPipette extends Item implements IFillableItem { + + public ItemPipette() { + this.setMaxDamage(0); + } + + @SideOnly(Side.CLIENT) protected IIcon overlayIcon; + + public int amount = 50; + + public FluidType type = Fluids.NONE; + + public int getMaxFill() { + if(this == ModItems.pipette_laboratory) + return 50; + else + return 1_000; + } + + public void initNBT(ItemStack stack) { + + stack.stackTagCompound = new NBTTagCompound(); + + this.setFill(stack, type, 0); + } + + public void setFill(ItemStack stack, FluidType type, int fill) { + if(!stack.hasTagCompound()) { + initNBT(stack); + } + + this.type = type; + stack.stackTagCompound.setInteger(type.getName(), fill); + } + + public int getFill(ItemStack stack, FluidType type) { + if(!stack.hasTagCompound()) { + initNBT(stack); + } + + return stack.stackTagCompound.getInteger(type.getName()); + } + + @Override + @SideOnly(Side.CLIENT) + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + + if(!stack.hasTagCompound()) { + initNBT(stack); + } + + if(!world.isRemote) { + if (this.getFill(stack, type) == 0) { + + if(this != ModItems.pipette_laboratory) + this.amount = player.isSneaking() ? Math.min(this.amount + 50, 1_000) : Math.max(this.amount - 50, 50); + else + this.amount = player.isSneaking() ? Math.min(this.amount + 1, 50) : Math.max(this.amount - 1, 1); + + + player.addChatMessage(new ChatComponentText(this.amount + "/" + this.getMaxFill() + "mB")); + } else { + player.addChatMessage(new ChatComponentText("Pipette not empty!")); + } + } + return stack; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + if(this == ModItems.pipette_laboratory) + list.add("Now with 50x more precision!"); + list.add("Fluid: " + type.getLocalizedName()); + list.add("Amount: " + this.getFill(stack, type) + "/" + amount + "mB (" + this.getMaxFill() + "mB)"); + } + + @Override + public boolean acceptsFluid(FluidType type, ItemStack stack) { + if(this == ModItems.pipette_boron || this == ModItems.pipette_laboratory) + return (type == this.type || this.getFill(stack, type) == 0); + return (type == this.type || this.getFill(stack, type) == 0) && !type.needsLeadContainer(); + } + + @Override + public int tryFill(FluidType type, int amount, ItemStack stack) { + + if(!acceptsFluid(type, stack)) + return amount; + + if(this.getFill(stack, type) == 0) + this.setFill(stack, type, 0); + + int req = this.amount - this.getFill(stack, type); + int toFill = Math.min(req, amount); + + this.setFill(stack, type, this.getFill(stack, type) + toFill); + + return amount - toFill; + } + + @Override + public boolean providesFluid(FluidType type, ItemStack stack) { + return this.type == type; + } + + @Override + public int tryEmpty(FluidType type, int amount, ItemStack stack) { + if(providesFluid(type, stack)) { + int toUnload = Math.min(amount, this.getFill(stack, type)); + this.setFill(stack, type,this.getFill(stack, type) - toUnload); + return toUnload; + } + return amount; + } + + //this took me way too long to figure out + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister icon) { + super.registerIcons(icon); + this.overlayIcon = icon.registerIcon("hbm:pipette_overlay"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamageForRenderPass(int p_77618_1_, int p_77618_2_) { + return p_77618_2_ == 1 ? this.overlayIcon : super.getIconFromDamageForRenderPass(p_77618_1_, p_77618_2_); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return true; + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack stack, int pass) { + if(pass == 0) { + return 0xffffff; + } else { + int j = Fluids.fromID(stack.getItemDamage()).getColor(); + + if(j < 0) { + j = 0xffffff; + } + + return j; + } + } + +} diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 845be3e2f..b403e401e 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3663,6 +3663,9 @@ item.powder_xe135_tiny.name=Tiny Pile of Xenon-135 Powder item.powder_yellowcake.name=Yellowcake item.powder_zirconium.name=Zirconium Powder item.power_net_tool.name=Cable Network Analysis Tool +item.pipette.name=Pipette +item.pipette_boron.name=Boron Pipette +item.pipette_laboratory.name=Laboratory Grade Pipette item.primer_357.name=.357 Magnum Primer (x24) item.primer_44.name=.44 Magnum Primer (x24) item.primer_50.name=Large Caliber Primer (x12) diff --git a/src/main/resources/assets/hbm/textures/items/pipette.png b/src/main/resources/assets/hbm/textures/items/pipette.png new file mode 100644 index 0000000000000000000000000000000000000000..00ebcd67423fdf013dbc4b3cac6c2339cb30d27a GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL4Qvd#}EtuWQiyR6_qFU9L_tJFivpG%*-@! zGi%}WddzD3zkYJMHb;ZW{r~^@dpy4}ZAueRJE{7jtGy#lz~P$1wlo1>ppZiJ;{Y}u a9tO#2u?t_u814cZ&EV1kQ0v!Yl3>X-g*0Hd~n}{(1^)q<7`njxgN@xNARHP?~ literal 0 HcmV?d00001 From 0ab03d7b77db2464064d72f80b7685adebf3da7d Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Fri, 5 Jan 2024 15:44:43 +0000 Subject: [PATCH 02/30] small flixes --- src/main/java/com/hbm/items/tool/ItemPipette.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hbm/items/tool/ItemPipette.java b/src/main/java/com/hbm/items/tool/ItemPipette.java index 9ca02b46a..6358bb521 100644 --- a/src/main/java/com/hbm/items/tool/ItemPipette.java +++ b/src/main/java/com/hbm/items/tool/ItemPipette.java @@ -24,7 +24,7 @@ public class ItemPipette extends Item implements IFillableItem { @SideOnly(Side.CLIENT) protected IIcon overlayIcon; - public int amount = 50; + public int amount; public FluidType type = Fluids.NONE; @@ -40,6 +40,7 @@ public class ItemPipette extends Item implements IFillableItem { stack.stackTagCompound = new NBTTagCompound(); this.setFill(stack, type, 0); + this.amount = getMaxFill() } public void setFill(ItemStack stack, FluidType type, int fill) { @@ -95,8 +96,8 @@ public class ItemPipette extends Item implements IFillableItem { @Override public boolean acceptsFluid(FluidType type, ItemStack stack) { if(this == ModItems.pipette_boron || this == ModItems.pipette_laboratory) - return (type == this.type || this.getFill(stack, type) == 0); - return (type == this.type || this.getFill(stack, type) == 0) && !type.needsLeadContainer(); + return (type == this.type || this.getFill(stack, type) == 0 && !type.isAntimatter()); + return (type == this.type || this.getFill(stack, type) == 0) && (!type.isCorrosive() && !type.isAntimatter()); } @Override From 72fa1bda7fb7b336970b5a5f1d81eb2b2d9eefd2 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Fri, 5 Jan 2024 16:30:30 +0000 Subject: [PATCH 03/30] raaagh --- src/main/java/com/hbm/items/tool/ItemPipette.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hbm/items/tool/ItemPipette.java b/src/main/java/com/hbm/items/tool/ItemPipette.java index 6358bb521..f0b8fb026 100644 --- a/src/main/java/com/hbm/items/tool/ItemPipette.java +++ b/src/main/java/com/hbm/items/tool/ItemPipette.java @@ -1,19 +1,23 @@ package com.hbm.items.tool; import api.hbm.fluid.IFillableItem; + import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.items.ModItems; + import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; + import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import com.hbm.items.ModItems; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ChatComponentText; import net.minecraft.util.IIcon; import net.minecraft.world.World; + import java.util.List; public class ItemPipette extends Item implements IFillableItem { @@ -24,7 +28,7 @@ public class ItemPipette extends Item implements IFillableItem { @SideOnly(Side.CLIENT) protected IIcon overlayIcon; - public int amount; + public int amount = this.getMaxFill(); public FluidType type = Fluids.NONE; @@ -40,7 +44,6 @@ public class ItemPipette extends Item implements IFillableItem { stack.stackTagCompound = new NBTTagCompound(); this.setFill(stack, type, 0); - this.amount = getMaxFill() } public void setFill(ItemStack stack, FluidType type, int fill) { From 56682e5c27c1fe5ba848acf2f858d59141edfc6e Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Fri, 5 Jan 2024 14:07:43 -0600 Subject: [PATCH 04/30] Small fix --- src/main/java/com/hbm/items/tool/ItemPipette.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/hbm/items/tool/ItemPipette.java b/src/main/java/com/hbm/items/tool/ItemPipette.java index f0b8fb026..f18bdd681 100644 --- a/src/main/java/com/hbm/items/tool/ItemPipette.java +++ b/src/main/java/com/hbm/items/tool/ItemPipette.java @@ -64,7 +64,6 @@ public class ItemPipette extends Item implements IFillableItem { } @Override - @SideOnly(Side.CLIENT) public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { if(!stack.hasTagCompound()) { From 5fc297a7b10761a1170de179575926c5a2e84df3 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sat, 6 Jan 2024 02:18:38 -0600 Subject: [PATCH 05/30] 2:15 am forgive my terrible coding --- .../java/com/hbm/crafting/ToolRecipes.java | 5 +- .../inventory/recipes/AssemblerRecipes.java | 6 + .../java/com/hbm/items/tool/ItemPipette.java | 110 ++++++++++++------ src/main/resources/assets/hbm/lang/en_US.lang | 6 +- .../assets/hbm/textures/items/pipette.png | Bin 186 -> 250 bytes .../hbm/textures/items/pipette_boron.png | Bin 0 -> 280 bytes .../hbm/textures/items/pipette_laboratory.png | Bin 0 -> 366 bytes .../items/pipette_laboratory_overlay.png | Bin 0 -> 141 bytes .../hbm/textures/items/pipette_overlay.png | Bin 159 -> 222 bytes 9 files changed, 87 insertions(+), 40 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/items/pipette_boron.png create mode 100644 src/main/resources/assets/hbm/textures/items/pipette_laboratory.png create mode 100644 src/main/resources/assets/hbm/textures/items/pipette_laboratory_overlay.png diff --git a/src/main/java/com/hbm/crafting/ToolRecipes.java b/src/main/java/com/hbm/crafting/ToolRecipes.java index 8b8f2c27c..0247bd6cc 100644 --- a/src/main/java/com/hbm/crafting/ToolRecipes.java +++ b/src/main/java/com/hbm/crafting/ToolRecipes.java @@ -128,7 +128,10 @@ public class ToolRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.bismuth_tool, 1), new Object[] { "TBT", "SRS", "SCS", 'T', TA.nugget(), 'B', ModItems.nugget_bismuth, 'S', ANY_RESISTANTALLOY.ingot(), 'R', ModItems.reacher, 'C', ModItems.circuit_aluminium }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.sat_designator, 1), new Object[] { "RRD", "PIC", " P", 'P', GOLD.plate(), 'R', Items.redstone, 'C', ModItems.circuit_gold, 'D', ModItems.sat_chip, 'I', GOLD.ingot() }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.sat_relay), new Object[] { ModItems.sat_chip, ModItems.ducttape, ModItems.radar_linker }); - + + CraftingManager.addRecipeAuto(new ItemStack(ModItems.pipette, 1), new Object[] { " L", " G ", "G ", 'L', ModItems.ingot_biorubber, 'G', KEY_CLEARGLASS}); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.pipette_boron, 1), new Object[] { " P", " B ", "B ", 'P', ANY_RUBBER.ingot(), 'B', ModBlocks.glass_boron}); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.mirror_tool), new Object[] { " A ", " IA", "I ", 'A', AL.ingot(), 'I', IRON.ingot() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.rbmk_tool), new Object[] { " A ", " IA", "I ", 'A', PB.ingot(), 'I', IRON.ingot() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.power_net_tool), new Object[] { "WRW", " I ", " B ", 'W', ModItems.wire_red_copper, 'R', REDSTONE.dust(), 'I', IRON.ingot(), 'B', ModItems.battery_su }); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index 315ac6eef..cc918d0cc 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -696,6 +696,12 @@ public class AssemblerRecipes { new ComparableStack(ModItems.motor, 2), }, 200); + makeRecipe(new ComparableStack(ModItems.pipette_laboratory, 1),new AStack[] { + new ComparableStack(ModBlocks.glass_boron, 2), + new OreDictStack(ANY_HARDPLASTIC.ingot(), 1), + new ComparableStack(ModItems.circuit_aluminium, 2) + }, 30); + makeRecipe(new ComparableStack(ModBlocks.turret_chekhov, 1), new AStack[] { new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), diff --git a/src/main/java/com/hbm/items/tool/ItemPipette.java b/src/main/java/com/hbm/items/tool/ItemPipette.java index f18bdd681..b59d6c42a 100644 --- a/src/main/java/com/hbm/items/tool/ItemPipette.java +++ b/src/main/java/com/hbm/items/tool/ItemPipette.java @@ -5,6 +5,7 @@ import api.hbm.fluid.IFillableItem; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; +import com.hbm.util.I18nUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -23,16 +24,13 @@ import java.util.List; public class ItemPipette extends Item implements IFillableItem { public ItemPipette() { - this.setMaxDamage(0); + this.canRepair = false; + this.setMaxDamage(1); } @SideOnly(Side.CLIENT) protected IIcon overlayIcon; - public int amount = this.getMaxFill(); - - public FluidType type = Fluids.NONE; - - public int getMaxFill() { + public short getMaxFill() { if(this == ModItems.pipette_laboratory) return 50; else @@ -43,24 +41,41 @@ public class ItemPipette extends Item implements IFillableItem { stack.stackTagCompound = new NBTTagCompound(); - this.setFill(stack, type, 0); + this.setFill(stack, Fluids.NONE, (short) 0); //sets "type" and "fill" NBT + stack.stackTagCompound.setShort("capacity", this.getMaxFill()); //set "capacity" } - public void setFill(ItemStack stack, FluidType type, int fill) { + public FluidType getType(ItemStack stack) { if(!stack.hasTagCompound()) { initNBT(stack); } - this.type = type; - stack.stackTagCompound.setInteger(type.getName(), fill); + return Fluids.fromID(stack.stackTagCompound.getShort("type")); } - public int getFill(ItemStack stack, FluidType type) { + public short getCapacity(ItemStack stack) { if(!stack.hasTagCompound()) { initNBT(stack); } - return stack.stackTagCompound.getInteger(type.getName()); + return stack.stackTagCompound.getShort("capacity"); + } + + public void setFill(ItemStack stack, FluidType type, short fill) { + if(!stack.hasTagCompound()) { + initNBT(stack); + } + + stack.stackTagCompound.setShort("type", (short) type.getID()); + stack.stackTagCompound.setShort("fill", fill); + } + + public short getFill(ItemStack stack) { + if(!stack.hasTagCompound()) { + initNBT(stack); + } + + return stack.stackTagCompound.getShort("fill"); } @Override @@ -71,17 +86,19 @@ public class ItemPipette extends Item implements IFillableItem { } if(!world.isRemote) { - if (this.getFill(stack, type) == 0) { - - if(this != ModItems.pipette_laboratory) - this.amount = player.isSneaking() ? Math.min(this.amount + 50, 1_000) : Math.max(this.amount - 50, 50); - else - this.amount = player.isSneaking() ? Math.min(this.amount + 1, 50) : Math.max(this.amount - 1, 1); - - - player.addChatMessage(new ChatComponentText(this.amount + "/" + this.getMaxFill() + "mB")); + // ok i need to add some explanation + if (this.getFill(stack) == 0) { //if the pipette is empty + int a; + if(this == ModItems.pipette_laboratory) //if the pipette is a laboratory pipette + //if the player is sneaking then the capacity should increase, else it should decrease (Math.min and Math.max for negative numbers/going over capacity) + a = player.isSneaking() ? Math.min(this.getCapacity(stack) + 1, 50) : Math.max(this.getCapacity(stack) - 1, 1); + else //if its not a laboratory pipette + //if the player is sneaking then the capacity should increase, else it should decrease + a = player.isSneaking() ? Math.min(this.getCapacity(stack) + 50, 1_000) : Math.max(this.getCapacity(stack) - 50, 50); + stack.stackTagCompound.setShort("capacity", (short) a); // set the capacity to the new value + player.addChatMessage(new ChatComponentText(a + "/" + this.getMaxFill() + "mB")); // send new value in chat for player to see } else { - player.addChatMessage(new ChatComponentText("Pipette not empty!")); + player.addChatMessage(new ChatComponentText(I18nUtil.resolveKey("desc.item.pipette.noEmpty"))); // if pipette is not empty, no chance in capacity and tell player } } return stack; @@ -89,17 +106,21 @@ public class ItemPipette extends Item implements IFillableItem { @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { - if(this == ModItems.pipette_laboratory) - list.add("Now with 50x more precision!"); - list.add("Fluid: " + type.getLocalizedName()); - list.add("Amount: " + this.getFill(stack, type) + "/" + amount + "mB (" + this.getMaxFill() + "mB)"); + if(this == ModItems.pipette_laboratory) { + list.add(I18nUtil.resolveKey("desc.item.pipette.corrosive")); + list.add(I18nUtil.resolveKey("desc.item.pipette.laboratory")); + } + if(this == ModItems.pipette_boron) + list.add(I18nUtil.resolveKey("desc.item.pipette.corrosive")); + if(this == ModItems.pipette) + list.add(I18nUtil.resolveKey("desc.item.pipette.noCorrosive")); + list.add("Fluid: " + this.getType(stack).getLocalizedName()); + list.add("Amount: " + this.getFill(stack) + "/" + this.getCapacity(stack) + "mB (" + this.getMaxFill() + "mB)"); } @Override public boolean acceptsFluid(FluidType type, ItemStack stack) { - if(this == ModItems.pipette_boron || this == ModItems.pipette_laboratory) - return (type == this.type || this.getFill(stack, type) == 0 && !type.isAntimatter()); - return (type == this.type || this.getFill(stack, type) == 0) && (!type.isCorrosive() && !type.isAntimatter()); + return (type == this.getType(stack) || this.getFill(stack) == 0) && (!type.isAntimatter()); } @Override @@ -108,27 +129,37 @@ public class ItemPipette extends Item implements IFillableItem { if(!acceptsFluid(type, stack)) return amount; - if(this.getFill(stack, type) == 0) - this.setFill(stack, type, 0); + if(this.getFill(stack) == 0) + this.setFill(stack, type, (short) 0); - int req = this.amount - this.getFill(stack, type); + int req = this.getCapacity(stack) - this.getFill(stack); int toFill = Math.min(req, amount); - this.setFill(stack, type, this.getFill(stack, type) + toFill); + this.setFill(stack, type, (short) (this.getFill(stack) + toFill)); + + //fizzling checks + if(this.getFill(stack) > 0 && (this.getType(stack).isCorrosive() && type != Fluids.ACID)) /*hydrogen peroxide corroding glass? unheard of! */ { + if(this == ModItems.pipette) { + //fizzle it! + stack.stackSize = 0; + } + } return amount - toFill; } @Override public boolean providesFluid(FluidType type, ItemStack stack) { - return this.type == type; + return this.getType(stack) == type; } @Override public int tryEmpty(FluidType type, int amount, ItemStack stack) { if(providesFluid(type, stack)) { - int toUnload = Math.min(amount, this.getFill(stack, type)); - this.setFill(stack, type,this.getFill(stack, type) - toUnload); + int toUnload = Math.min(amount, this.getFill(stack)); + this.setFill(stack, type,(short) (this.getFill(stack) - toUnload)); + if(this.getFill(stack) == 0) + this.setFill(stack, Fluids.NONE, (short) 0); return toUnload; } return amount; @@ -140,7 +171,10 @@ public class ItemPipette extends Item implements IFillableItem { @SideOnly(Side.CLIENT) public void registerIcons(IIconRegister icon) { super.registerIcons(icon); - this.overlayIcon = icon.registerIcon("hbm:pipette_overlay"); + if (this == ModItems.pipette_laboratory) + this.overlayIcon = icon.registerIcon("hbm:pipette_laboratory_overlay"); + else + this.overlayIcon = icon.registerIcon("hbm:pipette_overlay"); } @Override @@ -161,7 +195,7 @@ public class ItemPipette extends Item implements IFillableItem { if(pass == 0) { return 0xffffff; } else { - int j = Fluids.fromID(stack.getItemDamage()).getColor(); + int j = this.getType(stack).getColor(); if(j < 0) { j = 0xffffff; diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 401e6b48f..b091bfe19 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1003,7 +1003,11 @@ desc.item.kitArmor=Armor will be displaced by new set. desc.item.kitHaz=Armor will be displaced by hazmat suit. desc.item.kitPack=What a bargain! desc.item.kitPool=Please empty inventory before opening! -desc.item.pileRod=§eUse on drilled graphite to insert$§eUse screwdriver to extract$ +desc.item.pileRod=§eUse on drilled graphite to insert$§eUse screwdriver to extract$ +desc.item.pipette.corrosive=Can handle corrosive liquids. +desc.item.pipette.laboratory=Now with 50x more precision! +desc.item.pipette.noCorrosive=§eCannot handle corrosive liquids. +desc.item.pipette.noEmpty=§ePipette not empty! desc.item.rtgDecay=Decays to: %s desc.item.rtgHeat=Power Level: %s desc.item.storage.capacity=Capacity %s%%s diff --git a/src/main/resources/assets/hbm/textures/items/pipette.png b/src/main/resources/assets/hbm/textures/items/pipette.png index 00ebcd67423fdf013dbc4b3cac6c2339cb30d27a..b4c5c7e2275107903c7128234c030d494f8d342f 100644 GIT binary patch delta 172 zcmV;d08{_E0r~-uR)3F4L_t(IPh+4v*tBWWe-MUp85p57Q2?az+qZ9E_V3@n8De8& z8JWO5BEZRa|No2I_<}Wp3<1$Z1CVAYlVQb^|NrOBn+N9;1h>B+G=sprhp2qK0A2H@ z7bIwY^@9SN(KUno4P_Dr557`hGYBAuI7xm60hnfxlSy(m2qnOrPO?TA0NGBmlLrA{ aU;qH_#%$%hC*|}20000f{a-&hU7Mr9 z-ZnT%-yKvj~bQf3rCef$61IX{c} z3KoAQ7D}?H#XCKH%=%*1^t%d+`6ORsvcZlIEljf=87z-@elq4bVA4Ft zXVPXzhG!*{Ob;FS^|}22I1y13Hf{HNrE^*Ox&H$mRfI5V#aP P8AN%y`njxgN@xNA9nEF| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/pipette_laboratory.png b/src/main/resources/assets/hbm/textures/items/pipette_laboratory.png new file mode 100644 index 0000000000000000000000000000000000000000..314f232058bce08647d5f447235165df72ac3620 GIT binary patch literal 366 zcmV-!0g?WRP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0Ru@yK~y+TV;~2V z?t1?p$|N78F1tazA?0hY!4-e`^5s8FbK?ASgbk_P`T(q`anGy&Ak8mcy!e0j?p?S> zMktLHH12-!zur{>tOlg<$B!QjfB*hv`1kK0SYB0Cm5~X|!U2#qS65e~XrA{}22A61 z0SJJc&BMdP0CYB3Gsuv+kHi_e-2@pskN^CS*MOzh{{MgToq@qe;2vDFhK2@;9%d+w z0cKxqQX2aKYzazlqk20gk@?PB>-Z0t2U+GQhw90J~e2Q!#9U2mk;8 M07*qoM6N<$f=Jh$AOHXW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/pipette_laboratory_overlay.png b/src/main/resources/assets/hbm/textures/items/pipette_laboratory_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..8b1d9fef83cff6a7d8c78046da069a7ebd7e28db GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucK_yQY#}EtuWC_;A2_gwi-tzzdw;Oq~i)7aQ g>18@Qg^`VoK}VZA>h`1$&Op@+p00i_>zopr0Lt1Vo&W#< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/pipette_overlay.png b/src/main/resources/assets/hbm/textures/items/pipette_overlay.png index 7615025c908ca3a3f87d77f8fc5cd59ff08ec233..c6bf6aadb19ac2f570b7dff1c3831c26b9c83d68 100644 GIT binary patch delta 144 zcmV;B0B`@F0p0-9G+qGG$j8FK@cai< z00}TcX`BG0`RgAB25z7My8Mh7>hZb&ruh>PW77-*I9))ZbN00{s|MNUMnLSTZ%Bs$dq delta 80 zcmcb|IG=Gsn5T)Si(`m|f3gJYVMYU|%$NuEQ`i{SWPOx$2r%Y&FiFA7n8Uy^GlpS( jS`5R@Z-EX11_lfaOzT+K;!VVu7=Xaj)z4*}Q$iB}0sa?} From 67d0b833c7bed23c70d6e63761073f05a18814b7 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sat, 6 Jan 2024 02:28:36 -0600 Subject: [PATCH 06/30] swapping the sneaking control for changing capacity, seems more natural to shift to decrease. --- src/main/java/com/hbm/items/tool/ItemPipette.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/items/tool/ItemPipette.java b/src/main/java/com/hbm/items/tool/ItemPipette.java index b59d6c42a..a09ff9809 100644 --- a/src/main/java/com/hbm/items/tool/ItemPipette.java +++ b/src/main/java/com/hbm/items/tool/ItemPipette.java @@ -91,10 +91,10 @@ public class ItemPipette extends Item implements IFillableItem { int a; if(this == ModItems.pipette_laboratory) //if the pipette is a laboratory pipette //if the player is sneaking then the capacity should increase, else it should decrease (Math.min and Math.max for negative numbers/going over capacity) - a = player.isSneaking() ? Math.min(this.getCapacity(stack) + 1, 50) : Math.max(this.getCapacity(stack) - 1, 1); + a = !player.isSneaking() ? Math.min(this.getCapacity(stack) + 1, 50) : Math.max(this.getCapacity(stack) - 1, 1); else //if its not a laboratory pipette //if the player is sneaking then the capacity should increase, else it should decrease - a = player.isSneaking() ? Math.min(this.getCapacity(stack) + 50, 1_000) : Math.max(this.getCapacity(stack) - 50, 50); + a = !player.isSneaking() ? Math.min(this.getCapacity(stack) + 50, 1_000) : Math.max(this.getCapacity(stack) - 50, 50); stack.stackTagCompound.setShort("capacity", (short) a); // set the capacity to the new value player.addChatMessage(new ChatComponentText(a + "/" + this.getMaxFill() + "mB")); // send new value in chat for player to see } else { From 27d613e1c2138e8b2a73189f0d6f20aade4ee97c Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Sun, 7 Jan 2024 16:17:59 -0500 Subject: [PATCH 07/30] his name is jim, and he likes throwing rocks at people --- .../com/hbm/entity/mob/EntityGlyphid.java | 3 +- .../hbm/entity/mob/EntityGlyphidDigger.java | 120 +++++++++++++++++- .../hbm/entity/projectile/EntityRubble.java | 34 ++--- 3 files changed, 138 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/hbm/entity/mob/EntityGlyphid.java b/src/main/java/com/hbm/entity/mob/EntityGlyphid.java index dfe3c6376..d23688bde 100644 --- a/src/main/java/com/hbm/entity/mob/EntityGlyphid.java +++ b/src/main/java/com/hbm/entity/mob/EntityGlyphid.java @@ -176,8 +176,7 @@ public class EntityGlyphid extends EntityMob { protected Entity findPlayerToAttack() { if(this.isPotionActive(Potion.blindness)) return null; - EntityPlayer entityplayer = this.worldObj.getClosestVulnerablePlayerToEntity(this, useExtendedTargeting() ? 128D : 16D); - return entityplayer; + return this.worldObj.getClosestVulnerablePlayerToEntity(this, useExtendedTargeting() ? 128D : 16D); } @Override diff --git a/src/main/java/com/hbm/entity/mob/EntityGlyphidDigger.java b/src/main/java/com/hbm/entity/mob/EntityGlyphidDigger.java index 09801fe4b..1f9b2d343 100644 --- a/src/main/java/com/hbm/entity/mob/EntityGlyphidDigger.java +++ b/src/main/java/com/hbm/entity/mob/EntityGlyphidDigger.java @@ -1,12 +1,26 @@ package com.hbm.entity.mob; +import com.hbm.entity.projectile.EntityRubble; +import com.hbm.lib.Library; import com.hbm.main.ResourceManager; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.init.Blocks; +import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Vec3; import net.minecraft.world.World; +import java.util.List; + public class EntityGlyphidDigger extends EntityGlyphid { + protected Entity lastTarget; + protected double lastX; + protected double lastY; + protected double lastZ; public EntityGlyphidDigger(World world) { super(world); @@ -18,17 +32,119 @@ public class EntityGlyphidDigger extends EntityGlyphid { @Override public double getScale() { - return 1.25D; + return 1.3D; } @Override protected void applyEntityAttributes() { super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(35D); + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(50D); this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(1D); this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(5D); } + public int timer = 0; + @Override + public void onUpdate(){ + super.onUpdate(); + Entity e = this.getEntityToAttack(); + if (e != null) { + + this.lastX = e.posX; + this.lastY = e.posY; + this.lastZ = e.posZ; + + if (--timer <= 0) { + groundSlam(); + timer = 120; + } + } + } + /** + * Mainly composed of crusty old power fist code, with some touch ups + **/ + public void groundSlam(){ + if (!worldObj.isRemote && entityToAttack instanceof EntityLivingBase && this.getDistanceToEntity(entityToAttack) < (useExtendedTargeting() ? 128D : 16D)) { + Entity e = this.getEntityToAttack(); + + boolean topAttack = false; + + int l = 6; + float part = -1F / 16F; + + int bugX = (int) posX; + int bugY = (int) posY; + int bugZ = (int) posZ; + + Vec3 vec0 = getLookVec(); + + List list = Library.getBlockPosInPath(bugX, bugY, bugZ, l, vec0); + + for (int i = 0; i < 8; i++) { + vec0.rotateAroundY(part); + list.addAll(Library.getBlockPosInPath(bugX, bugY - 1, bugZ, l, vec0)); + } + + double velX = e.posX - lastX; + double velY = e.posY - lastY; + double velZ = e.posZ - lastZ; + + if(this.lastTarget != e) { + velX = velY = velZ = 0; + } else if (this.getDistanceToEntity(e) < 11) { + topAttack = true; + } + + int prediction = 60; + Vec3 delta = Vec3.createVectorHelper(e.posX - posX + velX * prediction, (e.posY + e.height / 2) - (posY + 1) + velY * prediction, e.posZ - posZ + velZ * prediction); + double len = delta.lengthVector(); + if(len < 3) return; + double targetYaw = -Math.atan2(delta.xCoord, delta.zCoord); + + double x = Math.sqrt(delta.xCoord * delta.xCoord + delta.zCoord * delta.zCoord); + double y = delta.yCoord; + double v0 = 1.2; + double v02 = v0 * v0; + double g = 0.07D; + double upperLower = topAttack ? 1 : -1; + double targetPitch = Math.atan((v02 + Math.sqrt(v02*v02 - g*(g*x*x + 2*y*v02)) * upperLower) / (g*x)); + Vec3 fireVec = null; + if(!Double.isNaN(targetPitch)) { + + fireVec = Vec3.createVectorHelper(v0, 0, 0); + fireVec.rotateAroundZ((float) -targetPitch); + fireVec.rotateAroundY((float) -(targetYaw + Math.PI * 0.5)); + } + + for (int[] ints : list) { + + int x1 = ints[0]; + int y1 = ints[1]; + int z1 = ints[2]; + + + Block b = worldObj.getBlock(x1, y1, z1); + float k = b.getExplosionResistance(null); + + if (k < 6000 && b.isNormalCube()) { + + EntityRubble rubble = new EntityRubble(worldObj); + rubble.posX = x1 + 0.5F; + rubble.posY = y1 + 2; + rubble.posZ = z1 + 0.5F; + + rubble.setMetaBasedOnBlock(b, worldObj.getBlockMetadata(x1, y1, z1)); + + if(fireVec != null) + rubble.setThrowableHeading(fireVec.xCoord, fireVec.yCoord, fireVec.zCoord, (float) v0, rand.nextFloat()); + + worldObj.spawnEntityInWorld(rubble); + + worldObj.setBlock(x1, y1, z1, Blocks.air); + } + } + } + } @Override public boolean isArmorBroken(float amount) { return this.rand.nextInt(100) <= Math.min(Math.pow(amount * 0.25, 2), 100); diff --git a/src/main/java/com/hbm/entity/projectile/EntityRubble.java b/src/main/java/com/hbm/entity/projectile/EntityRubble.java index 82aedea6b..5f8144cf7 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityRubble.java +++ b/src/main/java/com/hbm/entity/projectile/EntityRubble.java @@ -12,16 +12,11 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; -public class EntityRubble extends EntityThrowable { +public class EntityRubble extends EntityThrowableInterp { - public EntityRubble(World p_i1773_1_) + public EntityRubble(World world) { - super(p_i1773_1_); - } - - public EntityRubble(World p_i1774_1_, EntityLivingBase p_i1774_2_) - { - super(p_i1774_1_, p_i1774_2_); + super(world); } @Override @@ -30,19 +25,18 @@ public class EntityRubble extends EntityThrowable { this.dataWatcher.addObject(17, (int)Integer.valueOf(0)); } - public EntityRubble(World p_i1775_1_, double p_i1775_2_, double p_i1775_4_, double p_i1775_6_) - { - super(p_i1775_1_, p_i1775_2_, p_i1775_4_, p_i1775_6_); + public EntityRubble(World world, double x, double y, double z) { + super(world, x, y, z); } @Override - protected void onImpact(MovingObjectPosition p_70184_1_) + protected void onImpact(MovingObjectPosition mop) { - if (p_70184_1_.entityHit != null) + if (mop.entityHit != null) { byte b0 = 15; - p_70184_1_.entityHit.attackEntityFrom(ModDamageSource.rubble, b0); + mop.entityHit.attackEntityFrom(ModDamageSource.rubble, b0); } if(this.ticksExisted > 2) { @@ -55,7 +49,17 @@ public class EntityRubble extends EntityThrowable { PacketDispatcher.wrapper.sendToAllAround(new ParticleBurstPacket((int)Math.floor(posX), (int)posY, (int)Math.floor(posZ), this.dataWatcher.getWatchableObjectInt(16), this.dataWatcher.getWatchableObjectInt(17)), new TargetPoint(worldObj.provider.dimensionId, posX, posY, posZ, 50)); } } - + + @Override + public double getGravityVelocity() { + return 0.07D; + } + + @Override + protected float getAirDrag() { + return 1F; + } + public void setMetaBasedOnBlock(Block b, int i) { this.dataWatcher.updateObject(16, Block.getIdFromBlock(b)); From a410efcf56a23b612701573edcff87f33d007970 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Sun, 7 Jan 2024 16:24:31 -0500 Subject: [PATCH 08/30] sgouts --- src/main/java/com/hbm/entity/mob/EntityGlyphidScout.java | 7 +++++++ .../java/com/hbm/handler/pollution/PollutionHandler.java | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/src/main/java/com/hbm/entity/mob/EntityGlyphidScout.java b/src/main/java/com/hbm/entity/mob/EntityGlyphidScout.java index 7e0378bbd..2d7b5c887 100644 --- a/src/main/java/com/hbm/entity/mob/EntityGlyphidScout.java +++ b/src/main/java/com/hbm/entity/mob/EntityGlyphidScout.java @@ -81,6 +81,7 @@ public class EntityGlyphidScout extends EntityGlyphid { target.setLocationAndAngles(dirVec.xCoord, dirVec.yCoord, dirVec.zCoord, 0, 0); target.maxAge = 300; target.radius = 6; + target.setWaypointType(TASK_BUILD_HIVE); worldObj.spawnEntityInWorld(target); hasTarget = true; @@ -291,6 +292,12 @@ public class EntityGlyphidScout extends EntityGlyphid { return false; } + @Override + protected Entity findPlayerToAttack() { + if(this.isPotionActive(Potion.blindness)) return null; + + return this.worldObj.getClosestVulnerablePlayerToEntity(this, useExtendedTargeting() ? 128D : 8D); + } ///RAMPANT MODE STUFFS /** Finds the direction from the bug's location to the target and adds it to their current coord diff --git a/src/main/java/com/hbm/handler/pollution/PollutionHandler.java b/src/main/java/com/hbm/handler/pollution/PollutionHandler.java index 28cd279c4..cdb218fb3 100644 --- a/src/main/java/com/hbm/handler/pollution/PollutionHandler.java +++ b/src/main/java/com/hbm/handler/pollution/PollutionHandler.java @@ -11,6 +11,7 @@ import java.util.UUID; import com.hbm.config.MobConfig; import com.hbm.config.RadiationConfig; +import com.hbm.entity.mob.EntityGlyphidDigger; import com.hbm.entity.mob.EntityGlyphidScout; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent; @@ -362,8 +363,11 @@ public class PollutionHandler { if (soot >= MobConfig.rampantScoutSpawnThresh) { EntityGlyphidScout scout = new EntityGlyphidScout(event.world); + EntityGlyphidDigger digger = new EntityGlyphidDigger(event.world); scout.setLocationAndAngles(event.x, event.y, event.z, event.world.rand.nextFloat() * 360.0F, 0.0F); + digger.setLocationAndAngles(event.x, event.y, event.z, event.world.rand.nextFloat() * 360.0F, 0.0F); event.world.spawnEntityInWorld(scout); + event.world.spawnEntityInWorld(digger); } } } From acf65b8922aa73980f1ace0301502a3143bb6bf8 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Thu, 11 Jan 2024 18:40:08 -0500 Subject: [PATCH 09/30] minor scout tweak no.45 --- src/main/java/com/hbm/config/MobConfig.java | 4 ++-- .../java/com/hbm/entity/mob/EntityGlyphidScout.java | 10 ++++++++-- .../com/hbm/handler/pollution/PollutionHandler.java | 1 + 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hbm/config/MobConfig.java b/src/main/java/com/hbm/config/MobConfig.java index 1d57e39c8..e777a25bc 100644 --- a/src/main/java/com/hbm/config/MobConfig.java +++ b/src/main/java/com/hbm/config/MobConfig.java @@ -58,7 +58,7 @@ public class MobConfig { public static boolean rampantMode = false; public static boolean rampantNaturalScoutSpawn = false; - public static double rampantScoutSpawnThresh = 20; + public static double rampantScoutSpawnThresh = 14; public static int rampantScoutSpawnChance = 600; public static boolean scoutInitialSpawn = false; public static boolean rampantExtendedTargetting = false; @@ -101,7 +101,7 @@ public class MobConfig { spawnMax = CommonConfig.createConfigDouble(config, CATEGORY, "12.G07_spawnMax", "Maximum amount of glyphids being able to exist at once through natural spawning", 50); targetingThreshold = CommonConfig.createConfigDouble(config, CATEGORY, "12.G08_targetingThreshold", "Minimum amount of soot required for glyphids' extended targeting range to activate", 1D); - scoutSwarmSpawnChance = CommonConfig.createConfigInt(config, CATEGORY,"12.G10_scoutSwarmSpawn", "How likely are scouts to spawn in swarms, 1 in x chance format", 2); + scoutSwarmSpawnChance = CommonConfig.createConfigInt(config, CATEGORY,"12.G10_scoutSwarmSpawn", "How likely are scouts to spawn in swarms, 1 in x chance format", 3); largeHiveChance = CommonConfig.createConfigInt(config, CATEGORY,"12.G11_largeHiveChance", "The chance for a large hive to spawn, formula: 1/x", 5); largeHiveThreshold = CommonConfig.createConfigInt(config, CATEGORY,"12.G12_largeHiveThreshold", "The soot threshold for a large hive to spawn", 20); diff --git a/src/main/java/com/hbm/entity/mob/EntityGlyphidScout.java b/src/main/java/com/hbm/entity/mob/EntityGlyphidScout.java index 2d7b5c887..4d1e08a89 100644 --- a/src/main/java/com/hbm/entity/mob/EntityGlyphidScout.java +++ b/src/main/java/com/hbm/entity/mob/EntityGlyphidScout.java @@ -112,6 +112,10 @@ public class EntityGlyphidScout extends EntityGlyphid { hasTarget = true; } } + //fixes edge case where glyphids have no task and yet hasTarget is true + if(taskWaypoint == null && hasTarget){ + hasTarget = false; + } if (getCurrentTask() == TASK_TERRAFORM && super.isAtDestination() && canBuildHiveHere()) { communicate(TASK_TERRAFORM, taskWaypoint); @@ -295,9 +299,11 @@ public class EntityGlyphidScout extends EntityGlyphid { @Override protected Entity findPlayerToAttack() { if(this.isPotionActive(Potion.blindness)) return null; - - return this.worldObj.getClosestVulnerablePlayerToEntity(this, useExtendedTargeting() ? 128D : 8D); + //no extended targeting, and a low attack distance, ensures the scouts are focused in expanding, and not in chasing the player + return this.worldObj.getClosestVulnerablePlayerToEntity(this, 10); } + + ///RAMPANT MODE STUFFS /** Finds the direction from the bug's location to the target and adds it to their current coord diff --git a/src/main/java/com/hbm/handler/pollution/PollutionHandler.java b/src/main/java/com/hbm/handler/pollution/PollutionHandler.java index cdb218fb3..e946caeef 100644 --- a/src/main/java/com/hbm/handler/pollution/PollutionHandler.java +++ b/src/main/java/com/hbm/handler/pollution/PollutionHandler.java @@ -363,6 +363,7 @@ public class PollutionHandler { if (soot >= MobConfig.rampantScoutSpawnThresh) { EntityGlyphidScout scout = new EntityGlyphidScout(event.world); + //escort for the scout, which can also deal with obstacles EntityGlyphidDigger digger = new EntityGlyphidDigger(event.world); scout.setLocationAndAngles(event.x, event.y, event.z, event.world.rand.nextFloat() * 360.0F, 0.0F); digger.setLocationAndAngles(event.x, event.y, event.z, event.world.rand.nextFloat() * 360.0F, 0.0F); From 87cf1c80c3d259c25bf11167e75b2c9d1fde9aed Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Fri, 12 Jan 2024 19:01:08 -0500 Subject: [PATCH 10/30] ouch. --- .../java/com/hbm/entity/mob/EntityGlyphidDigger.java | 10 ++++++---- .../java/com/hbm/entity/projectile/EntityRubble.java | 7 +------ 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/hbm/entity/mob/EntityGlyphidDigger.java b/src/main/java/com/hbm/entity/mob/EntityGlyphidDigger.java index 1f9b2d343..f0c8d6a12 100644 --- a/src/main/java/com/hbm/entity/mob/EntityGlyphidDigger.java +++ b/src/main/java/com/hbm/entity/mob/EntityGlyphidDigger.java @@ -64,7 +64,7 @@ public class EntityGlyphidDigger extends EntityGlyphid { * Mainly composed of crusty old power fist code, with some touch ups **/ public void groundSlam(){ - if (!worldObj.isRemote && entityToAttack instanceof EntityLivingBase && this.getDistanceToEntity(entityToAttack) < (useExtendedTargeting() ? 128D : 16D)) { + if (!worldObj.isRemote && entityToAttack instanceof EntityLivingBase && this.getDistanceToEntity(entityToAttack) < 30) { Entity e = this.getEntityToAttack(); boolean topAttack = false; @@ -91,7 +91,9 @@ public class EntityGlyphidDigger extends EntityGlyphid { if(this.lastTarget != e) { velX = velY = velZ = 0; - } else if (this.getDistanceToEntity(e) < 11) { + } + + if (this.getDistanceToEntity(e) > 20) { topAttack = true; } @@ -105,7 +107,7 @@ public class EntityGlyphidDigger extends EntityGlyphid { double y = delta.yCoord; double v0 = 1.2; double v02 = v0 * v0; - double g = 0.07D; + double g = 0.03D; double upperLower = topAttack ? 1 : -1; double targetPitch = Math.atan((v02 + Math.sqrt(v02*v02 - g*(g*x*x + 2*y*v02)) * upperLower) / (g*x)); Vec3 fireVec = null; @@ -126,7 +128,7 @@ public class EntityGlyphidDigger extends EntityGlyphid { Block b = worldObj.getBlock(x1, y1, z1); float k = b.getExplosionResistance(null); - if (k < 6000 && b.isNormalCube()) { + if (k < 200 && b.isNormalCube()) { EntityRubble rubble = new EntityRubble(worldObj); rubble.posX = x1 + 0.5F; diff --git a/src/main/java/com/hbm/entity/projectile/EntityRubble.java b/src/main/java/com/hbm/entity/projectile/EntityRubble.java index 5f8144cf7..05459bcfd 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityRubble.java +++ b/src/main/java/com/hbm/entity/projectile/EntityRubble.java @@ -12,7 +12,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; -public class EntityRubble extends EntityThrowableInterp { +public class EntityRubble extends EntityThrowableNT { public EntityRubble(World world) { @@ -50,11 +50,6 @@ public class EntityRubble extends EntityThrowableInterp { } } - @Override - public double getGravityVelocity() { - return 0.07D; - } - @Override protected float getAirDrag() { return 1F; From c88ee74f7f548228c4c2dac367bd99d411362cd7 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Sat, 13 Jan 2024 08:04:43 -0500 Subject: [PATCH 11/30] flixes and tweaks --- src/main/java/com/hbm/entity/mob/EntityGlyphid.java | 2 +- .../java/com/hbm/entity/mob/EntityGlyphidBlaster.java | 2 +- .../com/hbm/entity/mob/EntityGlyphidBombardier.java | 10 +++++++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/hbm/entity/mob/EntityGlyphid.java b/src/main/java/com/hbm/entity/mob/EntityGlyphid.java index d23688bde..c0cbb40f2 100644 --- a/src/main/java/com/hbm/entity/mob/EntityGlyphid.java +++ b/src/main/java/com/hbm/entity/mob/EntityGlyphid.java @@ -315,7 +315,7 @@ public class EntityGlyphid extends EntityMob { if(source.isFireDamage()) { amount *= 0.7F; } else if(source.getDamageType().equals("player")) { - amount *= 1.5F; + amount *= getScale() < 1.25 ? 1.5 : getScale() < 1.3 ? 0.8 : 0.5; } else if(source == ModDamageSource.acid || source.equals(new DamageSource(ModDamageSource.s_acid))){ amount = 0; } else if(source == DamageSource.inWall) { diff --git a/src/main/java/com/hbm/entity/mob/EntityGlyphidBlaster.java b/src/main/java/com/hbm/entity/mob/EntityGlyphidBlaster.java index ef2ccde88..5eecc8132 100644 --- a/src/main/java/com/hbm/entity/mob/EntityGlyphidBlaster.java +++ b/src/main/java/com/hbm/entity/mob/EntityGlyphidBlaster.java @@ -60,7 +60,7 @@ public class EntityGlyphidBlaster extends EntityGlyphidBombardier { @Override public float getBombDamage() { - return 10F; + return 15F; } @Override diff --git a/src/main/java/com/hbm/entity/mob/EntityGlyphidBombardier.java b/src/main/java/com/hbm/entity/mob/EntityGlyphidBombardier.java index 7fda8206d..8a2093b63 100644 --- a/src/main/java/com/hbm/entity/mob/EntityGlyphidBombardier.java +++ b/src/main/java/com/hbm/entity/mob/EntityGlyphidBombardier.java @@ -46,7 +46,7 @@ public class EntityGlyphidBombardier extends EntityGlyphid { if(this.ticksExisted % 60 == 1) { - boolean topAttack = rand.nextBoolean(); + boolean topAttack = false; double velX = e.posX - lastX; double velY = e.posY - lastY; @@ -55,7 +55,11 @@ public class EntityGlyphidBombardier extends EntityGlyphid { if(this.lastTarget != e || Vec3.createVectorHelper(velX, velY, velZ).lengthVector() > 30) { velX = velY = velZ = 0; } - + + if (this.getDistanceToEntity(e) > 20) { + topAttack = true; + } + int prediction = topAttack ? 60 : 20; Vec3 delta = Vec3.createVectorHelper(e.posX - posX + velX * prediction, (e.posY + e.height / 2) - (posY + 1) + velY * prediction, e.posZ - posZ + velZ * prediction); double len = delta.lengthVector(); @@ -91,7 +95,7 @@ public class EntityGlyphidBombardier extends EntityGlyphid { } public float getBombDamage() { - return 1.5F; + return 5F; } public int getBombCount() { From 3854161ac926dd90793b04f3384c33f283f927cf Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Sun, 14 Jan 2024 12:11:21 -0500 Subject: [PATCH 12/30] forgor --- src/main/java/com/hbm/handler/pollution/PollutionHandler.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/handler/pollution/PollutionHandler.java b/src/main/java/com/hbm/handler/pollution/PollutionHandler.java index e946caeef..934a0524b 100644 --- a/src/main/java/com/hbm/handler/pollution/PollutionHandler.java +++ b/src/main/java/com/hbm/handler/pollution/PollutionHandler.java @@ -355,7 +355,8 @@ public class PollutionHandler { && !event.world.isRemote && event.world.provider.dimensionId == 0 && event.type == EnumCreatureType.monster - && event.world.canBlockSeeTheSky(event.x, event.y, event.z)) { + && event.world.canBlockSeeTheSky(event.x, event.y, event.z) + && !event.isCanceled()) { if (event.world.rand.nextInt(MobConfig.rampantScoutSpawnChance) == 0) { From 534daf7782919fb77e5a72e6af55fd27068ea7b4 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 14 Jan 2024 14:15:46 -0600 Subject: [PATCH 13/30] changed lab pipette from assembler to anvil, fixed rubber shit, should be done (circuits are because its considered a "micropipette" and is therefore much more complex than a normal pipette.) --- src/main/java/com/hbm/crafting/ToolRecipes.java | 4 ++-- .../java/com/hbm/inventory/recipes/AssemblerRecipes.java | 6 ------ .../java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java | 7 +++++++ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/hbm/crafting/ToolRecipes.java b/src/main/java/com/hbm/crafting/ToolRecipes.java index 0247bd6cc..bc5cdd935 100644 --- a/src/main/java/com/hbm/crafting/ToolRecipes.java +++ b/src/main/java/com/hbm/crafting/ToolRecipes.java @@ -129,8 +129,8 @@ public class ToolRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.sat_designator, 1), new Object[] { "RRD", "PIC", " P", 'P', GOLD.plate(), 'R', Items.redstone, 'C', ModItems.circuit_gold, 'D', ModItems.sat_chip, 'I', GOLD.ingot() }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.sat_relay), new Object[] { ModItems.sat_chip, ModItems.ducttape, ModItems.radar_linker }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.pipette, 1), new Object[] { " L", " G ", "G ", 'L', ModItems.ingot_biorubber, 'G', KEY_CLEARGLASS}); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.pipette_boron, 1), new Object[] { " P", " B ", "B ", 'P', ANY_RUBBER.ingot(), 'B', ModBlocks.glass_boron}); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.pipette, 1), new Object[] { " L", " G ", "G ", 'L', ANY_RUBBER.ingot(), 'G', KEY_CLEARGLASS}); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.pipette_boron, 1), new Object[] { " P", " B ", "B ", 'P', RUBBER.ingot(), 'B', ModBlocks.glass_boron}); CraftingManager.addRecipeAuto(new ItemStack(ModItems.mirror_tool), new Object[] { " A ", " IA", "I ", 'A', AL.ingot(), 'I', IRON.ingot() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.rbmk_tool), new Object[] { " A ", " IA", "I ", 'A', PB.ingot(), 'I', IRON.ingot() }); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index cc918d0cc..315ac6eef 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -696,12 +696,6 @@ public class AssemblerRecipes { new ComparableStack(ModItems.motor, 2), }, 200); - makeRecipe(new ComparableStack(ModItems.pipette_laboratory, 1),new AStack[] { - new ComparableStack(ModBlocks.glass_boron, 2), - new OreDictStack(ANY_HARDPLASTIC.ingot(), 1), - new ComparableStack(ModItems.circuit_aluminium, 2) - }, 30); - makeRecipe(new ComparableStack(ModBlocks.turret_chekhov, 1), new AStack[] { new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index 86921434e..a5dd5e1ba 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -422,6 +422,13 @@ public class AnvilRecipes { new ComparableStack(Items.leather, 4), new ComparableStack(Items.feather, 24) }, new AnvilOutput(new ItemStack(ModItems.wings_limp))).setTier(2)); + + constructionRecipes.add(new AnvilConstructionRecipe( + new AStack[] { + new ComparableStack(ModBlocks.glass_boron, 2), + new OreDictStack(ANY_HARDPLASTIC.ingot(), 1), + new ComparableStack(ModItems.circuit_aluminium, 2) + }, new AnvilOutput(new ItemStack(ModItems.pipette_laboratory))).setTier(3)); constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { From 413d14e2639c53383521c8ee0091320c4eff013a Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 14 Jan 2024 22:08:06 +0100 Subject: [PATCH 14/30] fuck me with a rusty knife --- src/main/java/com/hbm/items/armor/ArmorTrenchmaster.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/hbm/items/armor/ArmorTrenchmaster.java b/src/main/java/com/hbm/items/armor/ArmorTrenchmaster.java index 0036d36e6..4967059fc 100644 --- a/src/main/java/com/hbm/items/armor/ArmorTrenchmaster.java +++ b/src/main/java/com/hbm/items/armor/ArmorTrenchmaster.java @@ -50,6 +50,7 @@ public class ArmorTrenchmaster extends ArmorFSB { @Override public void handleHurt(LivingHurtEvent event) { + super.handleHurt(event); EntityLivingBase e = event.entityLiving; @@ -68,6 +69,7 @@ public class ArmorTrenchmaster extends ArmorFSB { @Override public void handleAttack(LivingAttackEvent event) { + super.handleAttack(event); EntityLivingBase e = event.entityLiving; From 4ad1dcea73d4fba588c28216b69f8e41ee457e0c Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 14 Jan 2024 22:43:29 +0100 Subject: [PATCH 15/30] mushroom machine broke --- .../com/hbm/blocks/generic/BlockMush.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/hbm/blocks/generic/BlockMush.java b/src/main/java/com/hbm/blocks/generic/BlockMush.java index 1651682a5..a13511b5f 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockMush.java +++ b/src/main/java/com/hbm/blocks/generic/BlockMush.java @@ -1,5 +1,6 @@ package com.hbm.blocks.generic; +import java.util.HashSet; import java.util.Random; import java.util.Set; @@ -47,17 +48,19 @@ public class BlockMush extends Block implements IGrowable, IPlantable { } } - private static final Set canGrowOn = Sets.newHashSet(new Block[] { - ModBlocks.waste_earth, - ModBlocks.waste_mycelium, - ModBlocks.waste_trinitite, - ModBlocks.waste_trinitite_red, - ModBlocks.block_waste, - ModBlocks.block_waste_painted, - ModBlocks.block_waste_vitrified - }); + private static final Set canGrowOn = new HashSet(); public boolean canMushGrowHere(World world, int x, int y, int z) { + if(canGrowOn.isEmpty()) { + canGrowOn.add(ModBlocks.waste_earth); + canGrowOn.add(ModBlocks.waste_mycelium); + canGrowOn.add(ModBlocks.waste_trinitite); + canGrowOn.add(ModBlocks.waste_trinitite_red); + canGrowOn.add(ModBlocks.block_waste); + canGrowOn.add(ModBlocks.block_waste_painted); + canGrowOn.add(ModBlocks.block_waste_vitrified); + } + Block block = world.getBlock(x, y - 1, z); return canGrowOn.contains(block); } @@ -75,7 +78,7 @@ public class BlockMush extends Block implements IGrowable, IPlantable { */ @Override public boolean func_149851_a(World world, int x, int y, int z, boolean b) { - return this.canMushGrowHere(world, x, y, z); + return canBlockStay(world, x, y, z); } /** From fbd9347fb8928732bd24aad982fd10369495a648 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 15 Jan 2024 09:37:41 +0100 Subject: [PATCH 16/30] Fixes --- changelog | 41 +-- .../blocks/machine/MachineStrandCaster.java | 327 +++++++++--------- src/main/java/com/hbm/config/WorldConfig.java | 2 + .../hbm/entity/effect/EntityFalloutRain.java | 3 + src/main/java/com/hbm/main/MainRegistry.java | 2 +- .../machine/TileEntityMachineRadarNT.java | 12 +- .../TileEntityMachineStrandCaster.java | 13 +- .../blocks/reactor_control_side_alt.png | Bin 497 -> 0 bytes .../blocks/reactor_control_top_alt.png | Bin 515 -> 0 bytes .../blocks/reactor_element_side_alt.png | Bin 566 -> 0 bytes .../blocks/reactor_element_top_alt.png | Bin 492 -> 0 bytes .../hbm/textures/blocks/reactor_side_alt.png | Bin 466 -> 0 bytes .../hbm/textures/blocks/reactor_top_alt.png | Bin 492 -> 0 bytes 13 files changed, 179 insertions(+), 221 deletions(-) delete mode 100644 src/main/resources/assets/hbm/textures/blocks/reactor_control_side_alt.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/reactor_control_top_alt.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/reactor_element_side_alt.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/reactor_element_top_alt.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/reactor_side_alt.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/reactor_top_alt.png diff --git a/changelog b/changelog index beb97cf8c..11d3c4adf 100644 --- a/changelog +++ b/changelog @@ -1,39 +1,8 @@ -## Added -* Large Radar - * A giant version of the radar with 3x the scan range -* Strand caster - * Watercooled foundry basin that processes large amounts of material at once - ## Changed -* Nuclear craters have been reworked - * The fallout effect no longer creates dead grass, instead it converts the area into three new biomes, the outer crater, crater and inner crater - * The entire crater is now slaked sellafite which now has texture variance to look more like debris, as well as getting darker towards the center - * The biomes being overridden means that nukes are now a solution to thaumcraft taint. Yay! - * There are now new ore variants for the block conversions which match the surrounding sellafite - * Beryllium ore now has a 100% chance of being converted into emerald -* The watz now cools up to 20% of its current heat level instead of 10%, making reactors a lot cooler and therefore react faster, which means more energy and faster depletion rates - * Mud production rates have been halved, to prevent currently working setups from exploding instantly - * This is your reminder that you can achieve more power, mud and depletion by building larger watz powerplants, i.e. stacking more watz segments on top of each other. Your tiny poo reactors make me sick. -* Watz pellets now have a 50% smaller yield, halving the expected time until depletion -* Adjusted the nuclear flash's intensity, the flash will now deal less and less radiation the longer it goes on -* The nuclear flash now bypasses radiation resistance, being only affected by blocks and distance -* Mushroom clouds' initial scale is now based on the total scale instead of all spawning roughly at the same size, causing fireballs to be comically small for huge bombs -* Removed the old mining drill, combustion generator, old watz core, structure marker, all old large reactor parts and CMB furnace for good -* Chemical plants will now eject all their outputs within a single tick if possible, increasing the throughput of fast recipes with many outputs, like asphalt -* Hitting CTRL + ALT when hovering over an item now displays a preview of that item. Useful if you want to get authentic renders for a wiki, or just like staring at things. -* 256k tanks and BAT9000s can now output comparator signals from their fluid ports -* Trenchmaster general damage multiplier has been halved, making it twice as strong -* Updated generation rules for layers like schist and hematite, they will now only replace things tagged as stone, just like most ores -* Mushroom clouds now have two additional outer condensation rings, those are not entirely finished and are still subject to change -* Small radars are now a lot cheaper -* Increased crucible pouring speed by 50% +* there is now a config option to disable the biome change caused by fallout. The config will also determine whether the biomes are registered at all, which prevents them from conflicting with other mods' biomes when disabled. ## Fixed -* Fixed a rare crash caused by radars force-loading chunks conflicting with certain mods' chunk loading changes -* Fixed PWR fuel rods not having any radiation value assigned to them -* Fixed trenchmaster helmet not having gas mask protection -* Fixed large thermobaric artillery rocket still using the wrong slag block -* Fixed some of the assembly templates having broken names due to using the wrong way of translating the output -* Fixed the soyuz launcher's NEI construction recipe showing the wrong amount of blocks -* Fixed molten meteorite cobble dropping itself in addition to turning into lava -* Fixed S~Cola RAD not being radish-colored +* Fixed trenchmaster armor not doing most of the armor calculation, making it the worst armor +* Fixed glowing mushrooms not being able to be bonemealed +* Fixed strand caster having one port that does not work with certain rotations +* Fixed fallout being able to replace bedrock diff --git a/src/main/java/com/hbm/blocks/machine/MachineStrandCaster.java b/src/main/java/com/hbm/blocks/machine/MachineStrandCaster.java index 9b2c6ced5..4a33bff5f 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineStrandCaster.java +++ b/src/main/java/com/hbm/blocks/machine/MachineStrandCaster.java @@ -10,12 +10,8 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMold; import com.hbm.items.machine.ItemScraps; import com.hbm.tileentity.TileEntityProxyCombo; -import com.hbm.tileentity.machine.TileEntityCrucible; -import com.hbm.tileentity.machine.TileEntityFoundryCastingBase; import com.hbm.tileentity.machine.TileEntityMachineStrandCaster; import com.hbm.util.I18nUtil; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.item.EntityItem; @@ -30,203 +26,204 @@ import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.List; -import java.util.Random; public class MachineStrandCaster extends BlockDummyable implements ICrucibleAcceptor, ILookOverlay, IToolable { - public MachineStrandCaster() { - super(Material.iron); - } + public MachineStrandCaster() { + super(Material.iron); + } - //reminder, if the machine is a solid brick, get dimensions will already handle it without the need to use fillSapce - //the order is up, down, forward, backward, left, right - //x is for left(-)/right(+), z is for forward(+)/backward(-), y you already know - @Override - public int[] getDimensions() { - return new int[]{0, 0, 6, 0, 1, 0}; - } + // reminder, if the machine is a solid brick, get dimensions will already + // handle it without the need to use fillSapce + // the order is up, down, forward, backward, left, right + // x is for left(-)/right(+), z is for forward(+)/backward(-), y you already + // know + @Override + public int[] getDimensions() { + return new int[] { 0, 0, 6, 0, 1, 0 }; + } - @Override - public int getOffset() { - return 0; - } + @Override + public int getOffset() { + return 0; + } - @Override - public TileEntity createNewTileEntity(World world, int meta) { - if (meta >= 12) return new TileEntityMachineStrandCaster(); - if (meta >= 6) return new TileEntityProxyCombo(true, false, true).moltenMetal(); - return null; - } + @Override + public TileEntity createNewTileEntity(World world, int meta) { + if(meta >= 12) return new TileEntityMachineStrandCaster(); + if(meta >= 6) return new TileEntityProxyCombo(true, false, true).moltenMetal(); + return null; + } - @Override - public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { - super.fillSpace(world, x, y, z, dir, o); + @Override + public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { + super.fillSpace(world, x, y, z, dir, o); - x += dir.offsetX * o; - z += dir.offsetZ * o; + x += dir.offsetX * o; + z += dir.offsetZ * o; - ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - //up,down;forward,backward;left,right - MultiblockHandlerXR.fillSpace(world, x, y, z, new int[]{2, 0, 1, 0, 1, 0}, this, dir); - //Fluid ports - this.makeExtra(world, x + rot.offsetX - dir.offsetX, y, z + rot.offsetZ - dir.offsetZ); - this.makeExtra(world, x - dir.offsetX, y, z - dir.offsetZ); - this.makeExtra(world, x - dir.offsetX * 5, y, z - dir.offsetZ * 5); - this.makeExtra(world, x + rot.offsetX - dir.offsetX * 5, y, z + rot.offsetZ - dir.offsetZ * 5); - //Molten slop ports - this.makeExtra(world, x + rot.offsetX - dir.offsetX, y + 2, z + rot.offsetZ - dir.offsetZ); - this.makeExtra(world, x - dir.offsetX, y + 2, z - dir.offsetZ); - this.makeExtra(world, x + rot.offsetX, y + 2, z + rot.offsetZ); - this.makeExtra(world, x, y + 2, z); - } + // up,down;forward,backward;left,right + MultiblockHandlerXR.fillSpace(world, x, y, z, new int[] { 2, 0, 1, 0, 1, 0 }, this, dir); + // Fluid ports + this.makeExtra(world, x + rot.offsetX - dir.offsetX, y, z + rot.offsetZ - dir.offsetZ); + this.makeExtra(world, x - dir.offsetX, y, z - dir.offsetZ); + this.makeExtra(world, x - dir.offsetX * 5, y, z - dir.offsetZ * 5); + this.makeExtra(world, x + rot.offsetX - dir.offsetX * 5, y, z + rot.offsetZ - dir.offsetZ * 5); + // Molten slop ports + this.makeExtra(world, x + rot.offsetX - dir.offsetX, y + 2, z + rot.offsetZ - dir.offsetZ); + this.makeExtra(world, x - dir.offsetX, y + 2, z - dir.offsetZ); + this.makeExtra(world, x + rot.offsetX, y + 2, z + rot.offsetZ); + this.makeExtra(world, x, y + 2, z); + } - @Override - public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, Mats.MaterialStack stack) { + @Override + public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, Mats.MaterialStack stack) { - TileEntity poured = world.getTileEntity(x, y, z); - if (!(poured instanceof TileEntityProxyCombo && ((TileEntityProxyCombo) poured).moltenMetal)) return false; + TileEntity poured = world.getTileEntity(x, y, z); + if(!(poured instanceof TileEntityProxyCombo && ((TileEntityProxyCombo) poured).moltenMetal)) return false; - int[] pos = this.findCore(world, x, y, z); - if (pos == null) return false; - TileEntity tile = world.getTileEntity(pos[0], pos[1], pos[2]); - if (!(tile instanceof TileEntityMachineStrandCaster)) return false; - TileEntityMachineStrandCaster caster = (TileEntityMachineStrandCaster) tile; + int[] pos = this.findCore(world, x, y, z); + if(pos == null) return false; + TileEntity tile = world.getTileEntity(pos[0], pos[1], pos[2]); + if(!(tile instanceof TileEntityMachineStrandCaster)) return false; + TileEntityMachineStrandCaster caster = (TileEntityMachineStrandCaster) tile; - return caster.canAcceptPartialPour(world, x, y, z, dX, dY, dZ, side, stack); - } + return caster.canAcceptPartialPour(world, x, y, z, dX, dY, dZ, side, stack); + } - @Override - public Mats.MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, Mats.MaterialStack stack) { + @Override + public Mats.MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, Mats.MaterialStack stack) { - TileEntity poured = world.getTileEntity(x, y, z); - if (!(poured instanceof TileEntityProxyCombo && ((TileEntityProxyCombo) poured).moltenMetal)) return stack; + TileEntity poured = world.getTileEntity(x, y, z); + if(!(poured instanceof TileEntityProxyCombo && ((TileEntityProxyCombo) poured).moltenMetal)) return stack; - int[] pos = this.findCore(world, x, y, z); - if (pos == null) return stack; - TileEntity tile = world.getTileEntity(pos[0], pos[1], pos[2]); - if (!(tile instanceof TileEntityMachineStrandCaster)) return stack; - TileEntityMachineStrandCaster caster = (TileEntityMachineStrandCaster) tile; + int[] pos = this.findCore(world, x, y, z); + if(pos == null) return stack; + TileEntity tile = world.getTileEntity(pos[0], pos[1], pos[2]); + if(!(tile instanceof TileEntityMachineStrandCaster)) return stack; + TileEntityMachineStrandCaster caster = (TileEntityMachineStrandCaster) tile; - return caster.pour(world, x, y, z, dX, dY, dZ, side, stack); - } + return caster.pour(world, x, y, z, dX, dY, dZ, side, stack); + } - @Override - public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, Mats.MaterialStack stack) { - return false; - } + @Override + public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, Mats.MaterialStack stack) { + return false; + } - @Override - public Mats.MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, Mats.MaterialStack stack) { - return null; - } + @Override + public Mats.MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, Mats.MaterialStack stack) { + return null; + } - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - if (world.isRemote) { - return true; - } + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(world.isRemote) { + return true; + } - int[] coords = findCore(world, x, y, z); - TileEntityMachineStrandCaster cast = (TileEntityMachineStrandCaster) world.getTileEntity(coords[0], coords[1], coords[2]); - if (cast != null) { - //insert mold - if (player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.mold && cast.slots[0] == null) { - cast.slots[0] = player.getHeldItem().copy(); - cast.slots[0].stackSize = 1; - player.getHeldItem().stackSize--; - world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:item.upgradePlug", 1.0F, 1.0F); - cast.markDirty(); - return true; + int[] coords = findCore(world, x, y, z); + TileEntityMachineStrandCaster cast = (TileEntityMachineStrandCaster) world.getTileEntity(coords[0], coords[1], coords[2]); + if(cast != null) { + // insert mold + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.mold && cast.slots[0] == null) { + cast.slots[0] = player.getHeldItem().copy(); + cast.slots[0].stackSize = 1; + player.getHeldItem().stackSize--; + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:item.upgradePlug", 1.0F, 1.0F); + cast.markDirty(); + return true; - } + } - if (player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemTool && player.getHeldItem().getItem().getToolClasses(player.getHeldItem()).contains("shovel")) { - if (cast.amount > 0) { - ItemStack scrap = ItemScraps.create(new Mats.MaterialStack(cast.type, cast.amount)); - if (!player.inventory.addItemStackToInventory(scrap)) { - EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); - world.spawnEntityInWorld(item); - } else { - player.inventoryContainer.detectAndSendChanges(); - } - cast.amount = 0; - cast.type = null; - cast.markDirty(); - } - return true; - } - } - return this.standardOpenBehavior(world, x, y, z, player, 0); - } + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemTool && player.getHeldItem().getItem().getToolClasses(player.getHeldItem()).contains("shovel")) { + if(cast.amount > 0) { + ItemStack scrap = ItemScraps.create(new Mats.MaterialStack(cast.type, cast.amount)); + if(!player.inventory.addItemStackToInventory(scrap)) { + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); + world.spawnEntityInWorld(item); + } else { + player.inventoryContainer.detectAndSendChanges(); + } + cast.amount = 0; + cast.type = null; + cast.markDirty(); + } + return true; + } + } + return this.standardOpenBehavior(world, x, y, z, player, 0); + } - @Override - public void breakBlock(World world, int x, int y, int z, Block b, int i) { + @Override + public void breakBlock(World world, int x, int y, int z, Block b, int i) { - TileEntity te = world.getTileEntity(x, y, z); - if (te instanceof TileEntityMachineStrandCaster) { - TileEntityMachineStrandCaster cast = (TileEntityMachineStrandCaster) te; + TileEntity te = world.getTileEntity(x, y, z); + if(te instanceof TileEntityMachineStrandCaster) { + TileEntityMachineStrandCaster cast = (TileEntityMachineStrandCaster) te; - if (cast.amount > 0) { - ItemStack scrap = ItemScraps.create(new Mats.MaterialStack(cast.type, cast.amount)); - EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); - world.spawnEntityInWorld(item); - cast.amount = 0; //just for safety - } - } - super.breakBlock(world, x, y, z, b, i); - } + if(cast.amount > 0) { + ItemStack scrap = ItemScraps.create(new Mats.MaterialStack(cast.type, cast.amount)); + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); + world.spawnEntityInWorld(item); + cast.amount = 0; // just for safety + } + } + super.breakBlock(world, x, y, z, b, i); + } - public void printHook(RenderGameOverlayEvent.Pre event, World world, int x, int y, int z) { - int[] coords = findCore(world, x, y, z); - if (coords == null) return; + public void printHook(RenderGameOverlayEvent.Pre event, World world, int x, int y, int z) { + int[] coords = findCore(world, x, y, z); + if(coords == null) + return; - TileEntityMachineStrandCaster cast = (TileEntityMachineStrandCaster) world.getTileEntity(coords[0], coords[1], coords[2]); + TileEntityMachineStrandCaster cast = (TileEntityMachineStrandCaster) world.getTileEntity(coords[0], coords[1], coords[2]); - List text = new ArrayList(); - if (cast != null) { - if (cast.slots[0] == null) { - text.add(EnumChatFormatting.RED + I18nUtil.resolveKey("foundry.noCast")); - } else if (cast.slots[0].getItem() == ModItems.mold) { - ItemMold.Mold mold = ((ItemMold) cast.slots[0].getItem()).getMold(cast.slots[0]); - text.add(EnumChatFormatting.BLUE + mold.getTitle()); - } - } - ILookOverlay.printGeneric(event, I18nUtil.resolveKey(this.getUnlocalizedName() + ".name"), 0xFF4000, 0x401000, text); - } + List text = new ArrayList(); + if(cast != null) { + if(cast.slots[0] == null) { + text.add(EnumChatFormatting.RED + I18nUtil.resolveKey("foundry.noCast")); + } else if(cast.slots[0].getItem() == ModItems.mold) { + ItemMold.Mold mold = ((ItemMold) cast.slots[0].getItem()).getMold(cast.slots[0]); + text.add(EnumChatFormatting.BLUE + mold.getTitle()); + } + } + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(this.getUnlocalizedName() + ".name"), 0xFF4000, 0x401000, text); + } - @Override - protected boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { - x += dir.offsetX * o; - z += dir.offsetZ * o; + @Override + protected boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { + x += dir.offsetX * o; + z += dir.offsetZ * o; - if (!MultiblockHandlerXR.checkSpace(world, x, y, z, getDimensions(), x, y, z, dir)) return false; - return MultiblockHandlerXR.checkSpace(world, x, y, z, new int[]{2, 0, 1, 0, 1, 0}, x, y, z, dir); - } + if(!MultiblockHandlerXR.checkSpace(world, x, y, z, getDimensions(), x, y, z, dir)) + return false; + return MultiblockHandlerXR.checkSpace(world, x, y, z, new int[] { 2, 0, 1, 0, 1, 0 }, x, y, z, dir); + } - @Override - public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { - if (tool != ToolType.SCREWDRIVER) - return false; + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + if(tool != ToolType.SCREWDRIVER) + return false; - int[] coords = findCore(world, x, y, z); - TileEntityMachineStrandCaster cast = (TileEntityMachineStrandCaster) world.getTileEntity(coords[0], coords[1], coords[2]); + int[] coords = findCore(world, x, y, z); + TileEntityMachineStrandCaster cast = (TileEntityMachineStrandCaster) world.getTileEntity(coords[0], coords[1], coords[2]); - if (cast.slots[0] == null) - return false; + if(cast.slots[0] == null) + return false; - if (!player.inventory.addItemStackToInventory(cast.slots[0].copy())) { - EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, cast.slots[0].copy()); - world.spawnEntityInWorld(item); - } else { - player.inventoryContainer.detectAndSendChanges(); - } + if(!player.inventory.addItemStackToInventory(cast.slots[0].copy())) { + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, cast.slots[0].copy()); + world.spawnEntityInWorld(item); + } else { + player.inventoryContainer.detectAndSendChanges(); + } - cast.markDirty(); + cast.slots[0] = null; + cast.markDirty(); - cast.slots[0] = null; - - return true; - } + return true; + } } - diff --git a/src/main/java/com/hbm/config/WorldConfig.java b/src/main/java/com/hbm/config/WorldConfig.java index 801563946..227010114 100644 --- a/src/main/java/com/hbm/config/WorldConfig.java +++ b/src/main/java/com/hbm/config/WorldConfig.java @@ -108,6 +108,7 @@ public class WorldConfig { public static int meteorShowerChance = 20 * 60 * 5; public static int meteorShowerDuration = 6000; + public static boolean enableCraterBiomes = true; public static int craterBiomeId = 80; public static int craterBiomeInnerId = 81; public static int craterBiomeOuterId = 82; @@ -227,6 +228,7 @@ public class WorldConfig { meteorShowerDuration = CommonConfig.createConfigInt(config, CATEGORY_METEOR, "5.05_meteorShowerDuration", "Max duration of meteor shower in ticks", 20 * 60 * 30); final String CATEGORY_BIOMES = CommonConfig.CATEGORY_BIOMES; + enableCraterBiomes = CommonConfig.createConfigBool(config, CATEGORY_BIOMES, "17.B_toggle", "Enables the biome change caused by nuclear explosions", true); craterBiomeId = CommonConfig.createConfigInt(config, CATEGORY_BIOMES, "17.B00_craterBiomeId", "The numeric ID for the crater biome", 80); craterBiomeInnerId = CommonConfig.createConfigInt(config, CATEGORY_BIOMES, "17.B01_craterBiomeInnerId", "The numeric ID for the inner crater biome", 81); craterBiomeOuterId = CommonConfig.createConfigInt(config, CATEGORY_BIOMES, "17.B02_craterBiomeOuterId", "The numeric ID for the outer crater biome", 82); diff --git a/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java b/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java index bcc6cd6b3..2f59a0408 100644 --- a/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java +++ b/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java @@ -4,6 +4,7 @@ import com.hbm.blocks.ModBlocks; import com.hbm.config.BombConfig; import com.hbm.config.FalloutConfigJSON; import com.hbm.config.FalloutConfigJSON.FalloutEntry; +import com.hbm.config.WorldConfig; import com.hbm.entity.item.EntityFallingBlockNT; import com.hbm.saveddata.AuxSavedData; import com.hbm.world.WorldUtil; @@ -114,6 +115,7 @@ public class EntityFalloutRain extends Entity { } public static BiomeGenBase getBiomeChange(double dist, int scale) { + if(!WorldConfig.enableCraterBiomes) return null; if(scale >= 150 && dist < 15) return BiomeGenCraterBase.craterInnerBiome; if(scale >= 100 && dist < 55) return BiomeGenCraterBase.craterBiome; if(scale >= 25) return BiomeGenCraterBase.craterOuterBiome; @@ -160,6 +162,7 @@ public class EntityFalloutRain extends Entity { Block b = worldObj.getBlock(x, y, z); if(b.getMaterial() == Material.air) continue; + if(b == Blocks.bedrock) return; Block ab = worldObj.getBlock(x, y + 1, z); int meta = worldObj.getBlockMetadata(x, y, z); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index b02fb3722..5809ea4ee 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -295,7 +295,7 @@ public class MainRegistry { OreDictManager.registerGroups(); //important to run first OreDictManager.registerOres(); - BiomeGenCraterBase.initDictionary(); + if(WorldConfig.enableCraterBiomes) BiomeGenCraterBase.initDictionary(); Library.superuser.add("192af5d7-ed0f-48d8-bd89-9d41af8524f8"); Library.superuser.add("5aee1e3d-3767-4987-a222-e7ce1fbdf88e"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java index 5d04f2aa6..ab8f13643 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java @@ -8,7 +8,6 @@ import java.util.function.Function; import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; import com.hbm.blocks.ModBlocks; -import com.hbm.config.WeaponConfig; import com.hbm.extprop.HbmLivingProps; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerMachineRadarNT; @@ -19,11 +18,8 @@ import com.hbm.items.ModItems; import com.hbm.items.tool.ItemCoordinateBase; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; -import com.hbm.packet.PacketDispatcher; import com.hbm.saveddata.SatelliteSavedData; import com.hbm.saveddata.satellites.Satellite; -import com.hbm.saveddata.satellites.Satellite.Interfaces; import com.hbm.saveddata.satellites.SatelliteHorizons; import com.hbm.saveddata.satellites.SatelliteLaser; import com.hbm.tileentity.IConfigurableMachine; @@ -40,12 +36,10 @@ import api.hbm.entity.IRadarDetectable; import api.hbm.entity.IRadarDetectableNT; import api.hbm.entity.IRadarDetectableNT.RadarScanParams; import api.hbm.entity.RadarEntry; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; -import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -59,7 +53,6 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraft.world.WorldServer; -import net.minecraftforge.common.util.ForgeDirection; /** * Now with SmЯt™ lag-free entity detection! (patent pending) @@ -462,12 +455,9 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I int z = data.getInteger("launchPosZ"); int y = 60; //one day I will make radars transmit Y coordinate as well and you will be butchered alhamdulila worldObj.playSoundAtEntity(player, "hbm:item.techBleep", 1.0F, 1.0F); - sat.onCoordAction(world,player,x,y,z); + sat.onCoordAction(world, player, x, y, z); } - } - - } if(link != null && link.getItem() == ModItems.radar_linker) { BlockPos pos = ItemCoordinateBase.getPosition(link); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java index 8a73e683f..c6dd3bc92 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java @@ -139,10 +139,10 @@ public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase ForgeDirection rot = dir.getRotation(ForgeDirection.UP); return new DirPos[] { - new DirPos(xCoord + rot.offsetX * 2 - dir.offsetX, yCoord, zCoord + rot.offsetZ * 2 - dir.offsetZ, rot), - new DirPos(xCoord - rot.offsetX - dir.offsetX, yCoord, zCoord - rot.offsetZ - dir.offsetZ, rot.getOpposite()), + new DirPos(xCoord + rot.offsetX * 2 - dir.offsetX, yCoord, zCoord + rot.offsetZ * 2 - dir.offsetZ, rot), + new DirPos(xCoord - rot.offsetX - dir.offsetX, yCoord, zCoord - rot.offsetZ - dir.offsetZ, rot.getOpposite()), new DirPos(xCoord + rot.offsetX * 2 - dir.offsetX * 5, yCoord, zCoord + rot.offsetZ * 2 - dir.offsetZ * 5, rot), - new DirPos(xCoord - rot.offsetX - dir.offsetX * 5, yCoord, zCoord - rot.offsetZ + dir.offsetZ * 5, rot.getOpposite()) + new DirPos(xCoord - rot.offsetX - dir.offsetX * 5, yCoord, zCoord - rot.offsetZ - dir.offsetZ * 5, rot.getOpposite()) }; } @@ -192,8 +192,7 @@ public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase @Override public boolean standardCheck(World world, int x, int y, int z, ForgeDirection side, Mats.MaterialStack stack) { - if(this.type != null && this.type != stack.material) - return false; + if(this.type != null && this.type != stack.material) return false; return !(this.amount >= this.getCapacity() || getInstalledMold() == null); } @@ -210,9 +209,7 @@ public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase private void updateConnections() { for(DirPos pos : getFluidConPos()) { this.trySubscribe(water.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); - } - for(DirPos pos : getFluidConPos()) { - sendFluid(steam, worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + this.sendFluid(steam, worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } diff --git a/src/main/resources/assets/hbm/textures/blocks/reactor_control_side_alt.png b/src/main/resources/assets/hbm/textures/blocks/reactor_control_side_alt.png deleted file mode 100644 index 20d8225885dcf020db53a665379a3aee60a9c819..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 497 zcmVJktEXW+ZmIU3AVNgrF=-%CbaCi4cMqBPoOsSZfhN+%c(?V!Pb} zP!t7|$>eVH^?K#2I2;a0?>)mX@bvVH5CV^n-*UqLFlmgT?|YO|7-MkG<>bV?_gPJ1 zr_%{*EmCVu(=@!jy#UZO4MkB9W8`@J3BYtZ&Fks(0l;#(L~D%%aL(mQecxvVxSxIkeVz?{Ur%W27w0%)IycG7~e#V2nXlRmEnr;duO!6aGe*r6(K7g4P0q*&(FI)55sV0;a?^%mkWL0=iZO~jajmgm~#$mEyZH7V7*>*KA&;U(KJo| z5>raCTCLDpXEvYDsjBK`!CFgQ*H~+@)@B8Xja4NE5MxB96Jv~78bDc=nT^|Vyi(300000NkvXXu0mjfg}~zz diff --git a/src/main/resources/assets/hbm/textures/blocks/reactor_control_top_alt.png b/src/main/resources/assets/hbm/textures/blocks/reactor_control_top_alt.png deleted file mode 100644 index bd53b0db81099c88e421ef9c2ece0cb2e85b2444..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 515 zcmV+e0{s1nP)g2b5QZNocB&{iAj-#KFJ1LeDN_Fh|Nn$k^^il$t`Mz& zLd=jvTD%7~*&x*Yn42Gs?RnpsQM1|1iwH_7j4>Ev&|0IE!h25>N-3OkD5Wl#?)7?P zSq4B51cYIDak;80K8vTPCv;ucoK7e5e1(Yc`1rL=_!p*&qM$5Gno73YMVs8PqFA=o zG;FoXan7NwwG4+t27?ny3B%!#APDf@b9)OQL{S7l6h&AIRkda?7+|eM1Bl3{I{y~> za5!8&;JwEfbHTc1dhbz6Q4|G1k|d1BW0uQ;JYQk0B~4S}IA*cf^8Eb$SLqgOEpKna z%gY*TExle3t(4+$IJD+e)%wcBKQX=E?o&l01IZJTP{h#$6Gxct_Lqu3E3q*wb`zZj%7+zmD zhzJi4Unt8GfcN(!BEsF>2oXW|`+X*p2}R+_vJ7K>w`;ShTf>@RIv&H8#c_=G-s7BO zI!&mmHQn85SU0-Ndw*W0`Fwt5p!dEVsP1+)QsBJKKLH{G`ev1RvJU_N002ovPDHLk FV1l4z<_7=( diff --git a/src/main/resources/assets/hbm/textures/blocks/reactor_element_side_alt.png b/src/main/resources/assets/hbm/textures/blocks/reactor_element_side_alt.png deleted file mode 100644 index b73f785d0a6b12463df1c608f46eccf61c4fd578..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 566 zcmV-60?GY}P)0eUo7J0E)Fqupm zZc!9OX__(^3>XXse13j%a&p4Q#|OjVkSxo{vW!lr!)mocYt7r+8~uKte!owerbGb7 z7_7BeYuRizIOmwnW>i&0RaGpPOSIO65cZ~u%Cf{5!~Oj|+p{r-%galgb2#TXKR>4| zOT713YnjjI=jdLq$JyB#@9*y@rSRUPwWizcvR<#T)-s(=IXXIOx`q%))08Ah z&>})vmRww1v_|vZQ&kn-djPJluMcnG`}@1KgD0@Lqxc_xgkjsoO7-2ynl+dwTKT756wH(b&XOAV+=aWGDf2jbzKueKqciUx=8 z_dDNoI2@3V$Ajnd$?k!hMzmL)<6thIRWiJ}N=Em@ZJvs!DBQW8SIT1%eiq-lx-Fvbi5^WLMB zqG=j{k6tHP*EPl%;yA`y+c(E?+>h|dtE!5ss*p*Nuvjc8%aRZRZQBl#_TKk_{nm6k zMG7IP>-sCI|4H6%H>|asPNz3i>-8Fd^ZESdtyU|v){JJe8T0wPM>U(xP)gyPBg-t+mwHA>Z)V)vu0000N2bZe?^J zG%heMHD!e|WdHyHP)S5VR5(w4l4(!EKoCIt!@!n8%Yv}9YW?8xp@9SlF-o8*w;E6U z)xKpAH}%-OOt#1Fyq#I6(MVkP*z;OJ5I39WT3>WJmqdYiwc4rGB7uLLBuOWed&siK z+3a~fe<8wny#9$&XAXN5-u{DG;QM+w%=-NaxUMUc(I`LQ`+m23o2EBVDk+m;xqQPU zj^ikbwAPEotH72)5QJe!lnfmBTdA=dN-68J89Wld-XsoZ$Khx}Fa;)PfRu+NRq z0Zarkpp@rNU}vb;Pn|fvwqF47NqmHIxlFBONZsg~G;UudGT=b(=#=z>%07*qo IM6N<$f{m%fJOBUy diff --git a/src/main/resources/assets/hbm/textures/blocks/reactor_top_alt.png b/src/main/resources/assets/hbm/textures/blocks/reactor_top_alt.png deleted file mode 100644 index f93b61cb9f29d65c0de8e74f203e31795093c8ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 492 zcmVN2bZe?^J zG%heMHD!e|WdHyHYDq*vR5(v%l5J1IFcgLR!+_1Pjcvl%l=(sB0||i;FcE?97NW+t z_^*AogLR2FC(UWs^*+75CXNfoxpdub5ada6lcu-*{vD%)Z@2rtpGoX7MKM~fp3!FW zy4$_)_aAwlXIU0SQ4j>n<*BYH8W_%~&C5-39EV{j!wON`Ffg8%&SsnGbk%CL9LKq+ zVm{v@OtabaJP$J(J)lM-Dl;69Uul|(1b;YuN;*~981Y>AjFcn^0NU|if~-toxI0PV zApo09o`4Y^W;}jGAPMY@1WB*gqeScV3t|eMZfukM)?i?=>|T@lH@0fDiy#r_Dv?X| zQE`L>gGJJmD3Qo;I(<_mNHEfN`(~w_1g6uuHhDh8fm9*>F<5C`KZM~`i9~S_R3zo4 zFpI@bU_xb`SA(rYA_EM1FKPvtssyAC)(c2w^Kl0|m#S(+zV8d8E*{O$()@>P57Wke3u&Q;9-0000 Date: Mon, 15 Jan 2024 10:19:39 +0100 Subject: [PATCH 17/30] cleaned up pipettes, chemplant loading change delay --- changelog | 10 +- .../java/com/hbm/crafting/ToolRecipes.java | 1 + .../inventory/recipes/anvil/AnvilRecipes.java | 7 - .../java/com/hbm/items/tool/ItemPipette.java | 296 +++++++++--------- .../machine/TileEntityMachineChemplant.java | 20 +- .../assets/hbm/textures/items/pipette.png | Bin 250 -> 205 bytes .../hbm/textures/items/pipette_boron.png | Bin 280 -> 213 bytes .../hbm/textures/items/pipette_empty.png | Bin 0 -> 91 bytes .../items/pipette_laboratory_overlay.png | Bin 141 -> 104 bytes .../hbm/textures/items/pipette_overlay.png | Bin 222 -> 151 bytes 10 files changed, 173 insertions(+), 161 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/items/pipette_empty.png diff --git a/changelog b/changelog index 11d3c4adf..bec2826a5 100644 --- a/changelog +++ b/changelog @@ -1,5 +1,13 @@ +## Added +* Pipettes + * Precision tools for carrying small amounts of liquids + * Come in three variants, normal, boron (corrosion-resistant) and laboratory (smaller capacity, more precision) + * Unlike most fluid containers, can be partially filled + * Capacity can be changed by right-clicking if the pipette is empty + ## Changed -* there is now a config option to disable the biome change caused by fallout. The config will also determine whether the biomes are registered at all, which prevents them from conflicting with other mods' biomes when disabled. +* There is now a config option to disable the biome change caused by fallout. The config will also determine whether the biomes are registered at all, which prevents them from conflicting with other mods' biomes when disabled. +* Chemical plants now have a timer that starts after loading/unloading fluids using item fluid containers from the input buffers, this creates a delay between switching from loading and unloading, making it possible to retrieve fluids using pipettes. ## Fixed * Fixed trenchmaster armor not doing most of the armor calculation, making it the worst armor diff --git a/src/main/java/com/hbm/crafting/ToolRecipes.java b/src/main/java/com/hbm/crafting/ToolRecipes.java index bc5cdd935..5d1edf7e4 100644 --- a/src/main/java/com/hbm/crafting/ToolRecipes.java +++ b/src/main/java/com/hbm/crafting/ToolRecipes.java @@ -131,6 +131,7 @@ public class ToolRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.pipette, 1), new Object[] { " L", " G ", "G ", 'L', ANY_RUBBER.ingot(), 'G', KEY_CLEARGLASS}); CraftingManager.addRecipeAuto(new ItemStack(ModItems.pipette_boron, 1), new Object[] { " P", " B ", "B ", 'P', RUBBER.ingot(), 'B', ModBlocks.glass_boron}); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.pipette_laboratory, 1), new Object[] { " C", " R ", "P ", 'C', ModItems.circuit_aluminium, 'R', RUBBER.ingot(), 'P', ModItems.pipette_boron }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.mirror_tool), new Object[] { " A ", " IA", "I ", 'A', AL.ingot(), 'I', IRON.ingot() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.rbmk_tool), new Object[] { " A ", " IA", "I ", 'A', PB.ingot(), 'I', IRON.ingot() }); diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index a5dd5e1ba..86921434e 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -422,13 +422,6 @@ public class AnvilRecipes { new ComparableStack(Items.leather, 4), new ComparableStack(Items.feather, 24) }, new AnvilOutput(new ItemStack(ModItems.wings_limp))).setTier(2)); - - constructionRecipes.add(new AnvilConstructionRecipe( - new AStack[] { - new ComparableStack(ModBlocks.glass_boron, 2), - new OreDictStack(ANY_HARDPLASTIC.ingot(), 1), - new ComparableStack(ModItems.circuit_aluminium, 2) - }, new AnvilOutput(new ItemStack(ModItems.pipette_laboratory))).setTier(3)); constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { diff --git a/src/main/java/com/hbm/items/tool/ItemPipette.java b/src/main/java/com/hbm/items/tool/ItemPipette.java index a09ff9809..b7829ae2c 100644 --- a/src/main/java/com/hbm/items/tool/ItemPipette.java +++ b/src/main/java/com/hbm/items/tool/ItemPipette.java @@ -23,186 +23,180 @@ import java.util.List; public class ItemPipette extends Item implements IFillableItem { - public ItemPipette() { - this.canRepair = false; - this.setMaxDamage(1); - } + public ItemPipette() { + this.canRepair = false; + this.setMaxDamage(1); + } - @SideOnly(Side.CLIENT) protected IIcon overlayIcon; + @SideOnly(Side.CLIENT) protected IIcon overlayIcon; + @SideOnly(Side.CLIENT) protected IIcon emptyIcon; - public short getMaxFill() { - if(this == ModItems.pipette_laboratory) - return 50; - else - return 1_000; - } + public short getMaxFill() { + if(this == ModItems.pipette_laboratory) return 50; + else return 1_000; + } - public void initNBT(ItemStack stack) { + public void initNBT(ItemStack stack) { + stack.stackTagCompound = new NBTTagCompound(); + this.setFill(stack, Fluids.NONE, (short) 0); // sets "type" and "fill" NBT + stack.stackTagCompound.setShort("capacity", this.getMaxFill()); // set "capacity" + } - stack.stackTagCompound = new NBTTagCompound(); + public FluidType getType(ItemStack stack) { + if(!stack.hasTagCompound()) { + initNBT(stack); + } - this.setFill(stack, Fluids.NONE, (short) 0); //sets "type" and "fill" NBT - stack.stackTagCompound.setShort("capacity", this.getMaxFill()); //set "capacity" - } + return Fluids.fromID(stack.stackTagCompound.getShort("type")); + } - public FluidType getType(ItemStack stack) { - if(!stack.hasTagCompound()) { - initNBT(stack); - } + public short getCapacity(ItemStack stack) { + if(!stack.hasTagCompound()) { + initNBT(stack); + } - return Fluids.fromID(stack.stackTagCompound.getShort("type")); - } + return stack.stackTagCompound.getShort("capacity"); + } - public short getCapacity(ItemStack stack) { - if(!stack.hasTagCompound()) { - initNBT(stack); - } + public void setFill(ItemStack stack, FluidType type, short fill) { + if(!stack.hasTagCompound()) { + initNBT(stack); + } - return stack.stackTagCompound.getShort("capacity"); - } + stack.stackTagCompound.setShort("type", (short) type.getID()); + stack.stackTagCompound.setShort("fill", fill); + } - public void setFill(ItemStack stack, FluidType type, short fill) { - if(!stack.hasTagCompound()) { - initNBT(stack); - } + public short getFill(ItemStack stack) { + if(!stack.hasTagCompound()) { + initNBT(stack); + } - stack.stackTagCompound.setShort("type", (short) type.getID()); - stack.stackTagCompound.setShort("fill", fill); - } + return stack.stackTagCompound.getShort("fill"); + } - public short getFill(ItemStack stack) { - if(!stack.hasTagCompound()) { - initNBT(stack); - } + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { - return stack.stackTagCompound.getShort("fill"); - } + if(!stack.hasTagCompound()) { + initNBT(stack); + } - @Override - public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + if(!world.isRemote) { + if(this.getFill(stack) == 0) { + int a; + if(this == ModItems.pipette_laboratory) + a = !player.isSneaking() ? Math.min(this.getCapacity(stack) + 1, 50) : Math.max(this.getCapacity(stack) - 1, 1); + else + a = !player.isSneaking() ? Math.min(this.getCapacity(stack) + 50, 1_000) : Math.max(this.getCapacity(stack) - 50, 50); + stack.stackTagCompound.setShort("capacity", (short) a); + player.addChatMessage(new ChatComponentText(a + "/" + this.getMaxFill() + "mB")); + } else { + player.addChatMessage(new ChatComponentText(I18nUtil.resolveKey("desc.item.pipette.noEmpty"))); + } + } + return stack; + } - if(!stack.hasTagCompound()) { - initNBT(stack); - } + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + if(this == ModItems.pipette_laboratory) { + list.add(I18nUtil.resolveKey("desc.item.pipette.corrosive")); + list.add(I18nUtil.resolveKey("desc.item.pipette.laboratory")); + } + if(this == ModItems.pipette_boron) + list.add(I18nUtil.resolveKey("desc.item.pipette.corrosive")); + if(this == ModItems.pipette) + list.add(I18nUtil.resolveKey("desc.item.pipette.noCorrosive")); + list.add("Fluid: " + this.getType(stack).getLocalizedName()); + list.add("Amount: " + this.getFill(stack) + "/" + this.getCapacity(stack) + "mB (" + this.getMaxFill() + "mB)"); + } - if(!world.isRemote) { - // ok i need to add some explanation - if (this.getFill(stack) == 0) { //if the pipette is empty - int a; - if(this == ModItems.pipette_laboratory) //if the pipette is a laboratory pipette - //if the player is sneaking then the capacity should increase, else it should decrease (Math.min and Math.max for negative numbers/going over capacity) - a = !player.isSneaking() ? Math.min(this.getCapacity(stack) + 1, 50) : Math.max(this.getCapacity(stack) - 1, 1); - else //if its not a laboratory pipette - //if the player is sneaking then the capacity should increase, else it should decrease - a = !player.isSneaking() ? Math.min(this.getCapacity(stack) + 50, 1_000) : Math.max(this.getCapacity(stack) - 50, 50); - stack.stackTagCompound.setShort("capacity", (short) a); // set the capacity to the new value - player.addChatMessage(new ChatComponentText(a + "/" + this.getMaxFill() + "mB")); // send new value in chat for player to see - } else { - player.addChatMessage(new ChatComponentText(I18nUtil.resolveKey("desc.item.pipette.noEmpty"))); // if pipette is not empty, no chance in capacity and tell player - } - } - return stack; - } + @Override + public boolean acceptsFluid(FluidType type, ItemStack stack) { + return (type == this.getType(stack) || this.getFill(stack) == 0) && (!type.isAntimatter()); + } - @Override - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { - if(this == ModItems.pipette_laboratory) { - list.add(I18nUtil.resolveKey("desc.item.pipette.corrosive")); - list.add(I18nUtil.resolveKey("desc.item.pipette.laboratory")); - } - if(this == ModItems.pipette_boron) - list.add(I18nUtil.resolveKey("desc.item.pipette.corrosive")); - if(this == ModItems.pipette) - list.add(I18nUtil.resolveKey("desc.item.pipette.noCorrosive")); - list.add("Fluid: " + this.getType(stack).getLocalizedName()); - list.add("Amount: " + this.getFill(stack) + "/" + this.getCapacity(stack) + "mB (" + this.getMaxFill() + "mB)"); - } + @Override + public int tryFill(FluidType type, int amount, ItemStack stack) { - @Override - public boolean acceptsFluid(FluidType type, ItemStack stack) { - return (type == this.getType(stack) || this.getFill(stack) == 0) && (!type.isAntimatter()); - } + if(!acceptsFluid(type, stack)) + return amount; - @Override - public int tryFill(FluidType type, int amount, ItemStack stack) { + if(this.getFill(stack) == 0) + this.setFill(stack, type, (short) 0); - if(!acceptsFluid(type, stack)) - return amount; + int req = this.getCapacity(stack) - this.getFill(stack); + int toFill = Math.min(req, amount); - if(this.getFill(stack) == 0) - this.setFill(stack, type, (short) 0); + this.setFill(stack, type, (short) (this.getFill(stack) + toFill)); - int req = this.getCapacity(stack) - this.getFill(stack); - int toFill = Math.min(req, amount); + // fizzling checks + if(this.getFill(stack) > 0 && (this.getType(stack).isCorrosive() && type != Fluids.ACID)) { + if(this == ModItems.pipette) { + stack.stackSize = 0; + } + } - this.setFill(stack, type, (short) (this.getFill(stack) + toFill)); + return amount - toFill; + } - //fizzling checks - if(this.getFill(stack) > 0 && (this.getType(stack).isCorrosive() && type != Fluids.ACID)) /*hydrogen peroxide corroding glass? unheard of! */ { - if(this == ModItems.pipette) { - //fizzle it! - stack.stackSize = 0; - } - } + @Override + public boolean providesFluid(FluidType type, ItemStack stack) { + return this.getType(stack) == type; + } - return amount - toFill; - } + @Override + public int tryEmpty(FluidType type, int amount, ItemStack stack) { + if(providesFluid(type, stack)) { + int toUnload = Math.min(amount, this.getFill(stack)); + this.setFill(stack, type, (short) (this.getFill(stack) - toUnload)); + if(this.getFill(stack) == 0) + this.setFill(stack, Fluids.NONE, (short) 0); + return toUnload; + } + return amount; + } - @Override - public boolean providesFluid(FluidType type, ItemStack stack) { - return this.getType(stack) == type; - } + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister icon) { + super.registerIcons(icon); + if(this == ModItems.pipette_laboratory) + this.overlayIcon = icon.registerIcon("hbm:pipette_laboratory_overlay"); + else + this.overlayIcon = icon.registerIcon("hbm:pipette_overlay"); + + this.emptyIcon = icon.registerIcon("hbm:pipette_empty"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(ItemStack stack, int pass) { + if(getFill(stack) == 0 && pass == 1) return this.emptyIcon; + return pass == 1 ? this.overlayIcon : getIconFromDamageForRenderPass(stack.getItemDamage(), pass); + } - @Override - public int tryEmpty(FluidType type, int amount, ItemStack stack) { - if(providesFluid(type, stack)) { - int toUnload = Math.min(amount, this.getFill(stack)); - this.setFill(stack, type,(short) (this.getFill(stack) - toUnload)); - if(this.getFill(stack) == 0) - this.setFill(stack, Fluids.NONE, (short) 0); - return toUnload; - } - return amount; - } + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return true; + } - //this took me way too long to figure out + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack stack, int pass) { + if(pass == 0) { + return 0xffffff; + } else { + int j = this.getType(stack).getColor(); - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister icon) { - super.registerIcons(icon); - if (this == ModItems.pipette_laboratory) - this.overlayIcon = icon.registerIcon("hbm:pipette_laboratory_overlay"); - else - this.overlayIcon = icon.registerIcon("hbm:pipette_overlay"); - } + if(j < 0) { + j = 0xffffff; + } - @Override - @SideOnly(Side.CLIENT) - public IIcon getIconFromDamageForRenderPass(int p_77618_1_, int p_77618_2_) { - return p_77618_2_ == 1 ? this.overlayIcon : super.getIconFromDamageForRenderPass(p_77618_1_, p_77618_2_); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return true; - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack stack, int pass) { - if(pass == 0) { - return 0xffffff; - } else { - int j = this.getType(stack).getColor(); - - if(j < 0) { - j = 0xffffff; - } - - return j; - } - } + return j; + } + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java index 3c421facd..110e79c9a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java @@ -86,6 +86,12 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements public String getName() { return "container.chemplant"; } + + // last successful load + int lsl0 = 0; + int lsl1 = 0; + int lsu0 = 0; + int lsu1 = 0; @Override public void updateEntity() { @@ -98,11 +104,21 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements this.isProgressing = false; this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); - if(!tanks[0].loadTank(17, 19, slots) && (slots[17] == null || slots[17].getItem() != ModItems.fluid_barrel_infinite)) tanks[0].unloadTank(17, 19, slots); - if(!tanks[1].loadTank(18, 20, slots) && (slots[18] == null || slots[18].getItem() != ModItems.fluid_barrel_infinite)) tanks[1].unloadTank(18, 20, slots); + int fluidDelay = 40; + + if(lsu0 >= fluidDelay && tanks[0].loadTank(17, 19, slots)) lsl0 = 0; + if(lsu1 >= fluidDelay && tanks[1].loadTank(18, 20, slots)) lsl1 = 0; + + if(lsl0 >= fluidDelay && slots[17] != null && slots[17].getItem() != ModItems.fluid_barrel_infinite) if(tanks[0].unloadTank(17, 19, slots)) lsu0 = 0; + if(lsl1 >= fluidDelay && slots[18] != null && slots[18].getItem() != ModItems.fluid_barrel_infinite) if(tanks[1].unloadTank(18, 20, slots)) lsu1 = 0; tanks[2].unloadTank(9, 11, slots); tanks[3].unloadTank(10, 12, slots); + + if(lsl0 < fluidDelay) lsl0++; + if(lsl1 < fluidDelay) lsl1++; + if(lsu0 < fluidDelay) lsu0++; + if(lsu1 < fluidDelay) lsu1++; loadItems(); unloadItems(); diff --git a/src/main/resources/assets/hbm/textures/items/pipette.png b/src/main/resources/assets/hbm/textures/items/pipette.png index b4c5c7e2275107903c7128234c030d494f8d342f..a24218949eefc5925fc372ce4f715746dac584d3 100644 GIT binary patch delta 177 zcmV;i08an<0nGuBB!2{RLP=Bz2nYy#2xN!=004wZL_t(Ijm?lT3c^4TMPI-p>Fq=FSU;5CABp5M%5PTjAj@ z0o+bKwN{UJfdNuhbHc}rRn4+p^gVpMI^gNK!~71X?10aY9V%vMKkmAD4W}%*YQs|9 f4X*9(%72j=TxexSwm3N{00000NkvXXu0mjf!W>Ok delta 222 zcmV<403rX)0r~-uB!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000id z000id0mpBsWB>pFk4Z#9R5(v#pgY*KY14lYhH@Dgp)^qdr19IgZ(#QC-@h4RV`CYa zz&s+r$#?(%i`)2uHG&KQ(L@7~W+;KtUGt_F zBxrv1g94k;HG}*OWfBGtzEWT_2q1?zNqzCuPO_5+0bpPN Y0PeoCIA2c diff --git a/src/main/resources/assets/hbm/textures/items/pipette_boron.png b/src/main/resources/assets/hbm/textures/items/pipette_boron.png index 746c115f7781c96492fe2a3aa2cfae03de8398aa..7bf66ade3f382e17332ec4fe9fb1c1e3192348c4 100644 GIT binary patch delta 185 zcmV;q07n0q0@VSKB!2{RLP=Bz2nYy#2xN!=004|hL_t(Ijm?lT3Iah4Mc;x~n6u6q zQrk{#E7msl7A`V{2->XJ45{V-v0B!#(YPSKE|ACn3H%xnF%hwG?!0mc0f15pF~)B3 zsl2_a0SvnhwN_8=Bm<GZx^prw85kH?(j9#r85lP9bN@+X1@buyJR*x382Ao@Fyrz3 z6)8Z$$(}BbAr}703#@0D=ijRrXe*MGSZET+u;k+`6ORsvcZlIEljf=87z-@elq4bVA4FtXVPXzhG!*{Ob;FS^|}22I1y1GU}oXkrG1_qXNM_)$E)e-c@Ne9i)o$YKTtzQZ8Qcszea z3Q$nV)5S5w!arGpb#a17LX)@r|Nreqp6nu-b$@!9&Q4)uV`I?K=8n2O>4P&+HG`+C KpUXO@geCw8TOl+6 diff --git a/src/main/resources/assets/hbm/textures/items/pipette_overlay.png b/src/main/resources/assets/hbm/textures/items/pipette_overlay.png index c6bf6aadb19ac2f570b7dff1c3831c26b9c83d68..207f90f2e2fa58a0b4575d67d37045177e071025 100644 GIT binary patch delta 122 zcmV-=0EPeF0ha-gBy$9FLP=Bz2nYy#2xN!=002%&L_t(IjqQ%X4!|G?#l-*rTHxND zFvet4=8|3Pk)-sMa#+U902uFeMGn#3^JRd$`g8$6R7FHSEk7<$)h4COQSYCmGZx^prw85kH?(j9#r85lP9bN@+X1@buyJR*x382Ao@Fyrz3 z6)8Z$Vow*x5DWig3DzUcvHJi2@Bj1hf4zn{-;4z&aSWGE96xm6!yon#22KN~%sC88 ze!iAxW6N8>xa&`k#H)|H7?%AM7D&F#!(A9f~<$@3Z-85x%Fn5~Ixz0(i0pTX1B&t;ucLK6Uu1xNM( From 5618be2d638ba83ceccc0a646c0c5998c61c945f Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 15 Jan 2024 15:51:26 +0100 Subject: [PATCH 18/30] missile rendering, fixes --- changelog | 7 + .../hbm/items/machine/ItemMachineUpgrade.java | 78 ------- src/main/java/com/hbm/main/ClientProxy.java | 36 +++- .../render/item/ItemRenderMissileGeneric.java | 192 ++++++++++++++++++ .../render/item/ItemRendererMeteorSword.java | 182 ++++++++++++----- .../tileentity/RenderLaunchPadTier1.java | 190 +---------------- .../hbm/tileentity/IUpgradeInfoProvider.java | 2 + .../machine/TileEntityMachineCyclotron.java | 45 +++- .../machine/TileEntityMachineExcavator.java | 2 +- src/main/resources/assets/hbm/lang/en_US.lang | 2 + 10 files changed, 417 insertions(+), 319 deletions(-) create mode 100644 src/main/java/com/hbm/render/item/ItemRenderMissileGeneric.java diff --git a/changelog b/changelog index bec2826a5..7293090d2 100644 --- a/changelog +++ b/changelog @@ -8,9 +8,16 @@ ## Changed * There is now a config option to disable the biome change caused by fallout. The config will also determine whether the biomes are registered at all, which prevents them from conflicting with other mods' biomes when disabled. * Chemical plants now have a timer that starts after loading/unloading fluids using item fluid containers from the input buffers, this creates a delay between switching from loading and unloading, making it possible to retrieve fluids using pipettes. +* In addition to delaying overheats, efficiency upgrades now reduce the cyclotron's coolant demand +* Removed the tooltips from common upgrades, as the info was incomplete and outdated anyway +* Meteorite swords now render their variant glint in first person view +* Meteorite swords are now a lot larger, similar to most other NTM swords +* Non-custom missile items now render in 3D ## Fixed * Fixed trenchmaster armor not doing most of the armor calculation, making it the worst armor * Fixed glowing mushrooms not being able to be bonemealed * Fixed strand caster having one port that does not work with certain rotations * Fixed fallout being able to replace bedrock +* Fixed the upgrade info of the large mining drill being incorrect +* Fixed cyclotron not having the new upgrade info tooltip diff --git a/src/main/java/com/hbm/items/machine/ItemMachineUpgrade.java b/src/main/java/com/hbm/items/machine/ItemMachineUpgrade.java index 3e165b474..99619f968 100644 --- a/src/main/java/com/hbm/items/machine/ItemMachineUpgrade.java +++ b/src/main/java/com/hbm/items/machine/ItemMachineUpgrade.java @@ -57,84 +57,6 @@ public class ItemMachineUpgrade extends Item { } } - if(this.type == UpgradeType.SPEED) { - list.add(EnumChatFormatting.RED + "Mining Drill:"); - list.add("Delay -" + (15 * this.tier) + "% / Consumption +" + (300 * this.tier) + "HE/t"); - list.add(EnumChatFormatting.RED + "Laser Miner:"); - list.add("Delay ÷" + (1 + this.tier) + " / Consumption +" + (625 * this.tier) + "HE/t"); - list.add(EnumChatFormatting.RED + "Electric Furnace:"); - list.add("Delay -" + (25 * this.tier) + "% / Consumption +" + (50 * this.tier) + "HE/t"); - list.add(EnumChatFormatting.RED + "Assembly Machine:"); - list.add("Delay -" + (25 * this.tier) + "% / Consumption +" + (300 * this.tier) + "HE/t"); - list.add(EnumChatFormatting.RED + "Chemical Plant:"); - list.add("Delay -" + (25 * this.tier) + "% / Consumption +" + (300 * this.tier) + "HE/t"); - list.add(EnumChatFormatting.RED + "Oil Wells:"); - list.add("Delay -" + (25 * this.tier) + "% / Consumption +" + (25 * this.tier) + "%"); - list.add(EnumChatFormatting.RED + "Crystallizer:"); - list.add("Delay -" + (20 * this.tier) + "% / Consumption +" + (1000 * this.tier) + "HE/t"); - list.add(EnumChatFormatting.RED + "Cyclotron:"); - list.add("Speed x" + (1 + this.tier)); - list.add(EnumChatFormatting.RED + "Flare Stack:"); - list.add("Speed x" + (1 + this.tier)); - list.add(EnumChatFormatting.RED + "Maxwell:"); - list.add("Damage +" + (0.25 * (double)this.tier) + "dmg/t"); - } - - if(this.type == UpgradeType.EFFECT) { - list.add(EnumChatFormatting.RED + "Mining Drill:"); - list.add("Radius +" + this.tier + "m / Consumption +" + (80 * this.tier) + "HE/t"); - list.add(EnumChatFormatting.RED + "Crystallizer:"); - list.add("+" + (5 * this.tier) + "% chance of not consuming an item / Acid consumption +" + (1000 * this.tier) + "mB"); - list.add(EnumChatFormatting.RED + "Cyclotron:"); - list.add("-" + (100 - 100 / (this.tier + 1)) + "% chance of incrementing overheat counter"); - list.add(EnumChatFormatting.RED + "Flare Stack:"); - list.add("+" + (100 * this.tier / 3) + "% power production"); - list.add(EnumChatFormatting.RED + "Maxwell:"); - list.add("Range +" + (3 * this.tier) + "m"); - } - - if(this.type == UpgradeType.POWER) { - list.add(EnumChatFormatting.RED + "Mining Drill:"); - list.add("Consumption -" + (30 * this.tier) + "HE/t / Delay +" + (5 * this.tier) + "%"); - list.add(EnumChatFormatting.RED + "Electric Furnace:"); - list.add("Consumption -" + (15 * this.tier) + "HE/t / Delay +" + (10 * this.tier) + "%"); - list.add(EnumChatFormatting.RED + "Assembly Machine:"); - list.add("Consumption -" + (30 * this.tier) + "HE/t / Delay +" + (5 * this.tier) + "%"); - list.add(EnumChatFormatting.RED + "Chemical Plant:"); - list.add("Consumption -" + (30 * this.tier) + "HE/t / Delay +" + (5 * this.tier) + "%"); - list.add(EnumChatFormatting.RED + "Oil Wells:"); - list.add("Consumption -" + (25 * this.tier) + "% / Delay +" + (10 * this.tier) + "%"); - list.add(EnumChatFormatting.RED + "Cyclotron:"); - list.add("Consumption -" + (100 * this.tier) + "kHE/t"); - list.add(EnumChatFormatting.RED + "Maxwell:"); - list.add("Consumption -" + (150 * this.tier) + "HE/t"); - list.add("Consumption when firing -" + (1500 * this.tier) + "HE/t"); - } - - if(this == ModItems.upgrade_fortune_1) { - list.add(EnumChatFormatting.RED + "Mining Drill:"); - list.add("Fortune +1 / Delay +15"); - } - - if(this == ModItems.upgrade_fortune_2) { - list.add(EnumChatFormatting.RED + "Mining Drill:"); - list.add("Fortune +2 / Delay +30"); - } - - if(this == ModItems.upgrade_fortune_3) { - list.add(EnumChatFormatting.RED + "Mining Drill:"); - list.add("Fortune +3 / Delay +45"); - } - - if(this.type == UpgradeType.AFTERBURN) { - list.add(EnumChatFormatting.RED + "Turbofan:"); - list.add("Production x" + (this.tier + 1) + " / Consumption x" + (this.tier + 2)); - list.add(EnumChatFormatting.RED + "Maxwell:"); - list.add("Afterburn +" + (this.tier * 3) + "s"); - list.add(EnumChatFormatting.RED + "Oil Wells:"); - list.add("Burn " + (this.tier * 10) + "mB of gas for " + (this.tier * 50) + "HE/t"); - } - if(this == ModItems.upgrade_radius) { list.add(EnumChatFormatting.RED + "Forcefield Range Upgrade"); list.add("Radius +16 / Consumption +500"); diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index e323183b7..8116119b3 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -41,6 +41,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; + import java.util.Random; import com.hbm.blocks.ModBlocks; @@ -90,6 +91,7 @@ import com.hbm.render.entity.mob.*; import com.hbm.render.entity.projectile.*; import com.hbm.render.entity.rocket.*; import com.hbm.render.item.*; +import com.hbm.render.item.ItemRenderMissileGeneric.RenderMissileType; import com.hbm.render.item.block.*; import com.hbm.render.item.weapon.*; import com.hbm.render.loader.HmfModelLoader; @@ -415,10 +417,36 @@ public class ClientProxy extends ServerProxy { MinecraftForgeClient.registerItemRenderer(ModItems.cmb_sword, new ItemRenderTransformer(rtp, ttp_high, stp, rfp, tfp, sfp, rir, tir, sir)); MinecraftForgeClient.registerItemRenderer(ModItems.dnt_sword, new ItemRenderTransformer(rtp, ttp_high, stp, rfp, tfp, sfp, rir, tir, sir)); - /*for(ItemSwordMeteorite sword : ItemSwordMeteorite.swords) { - MinecraftForgeClient.registerItemRenderer(sword, new ItemRenderTransformer(rtp, ttp_high, stp, rfp, tfp, sfp, rir, tir, sir)); - }*/ - + ItemRenderMissileGeneric.init(); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_taint, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER0)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_micro, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER0)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_bhole, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER0)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_schrabidium, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER0)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_emp, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER0)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_stealth, new ItemRenderMissileGeneric(RenderMissileType.TYPE_STEALTH)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_generic, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER1)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_incendiary, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER1)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_cluster, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER1)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_buster, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER1)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_decoy, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER1)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_anti_ballistic, new ItemRenderMissileGeneric(RenderMissileType.TYPE_ABM)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_strong, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER2)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_incendiary_strong, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER2)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_cluster_strong, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER2)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_buster_strong, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER2)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_emp_strong, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER2)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_burst, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER3)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_inferno, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER3)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_rain, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER3)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_drill, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER3)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_nuclear, new ItemRenderMissileGeneric(RenderMissileType.TYPE_NUCLEAR)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_nuclear_cluster, new ItemRenderMissileGeneric(RenderMissileType.TYPE_NUCLEAR)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_volcano, new ItemRenderMissileGeneric(RenderMissileType.TYPE_NUCLEAR)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_endo, new ItemRenderMissileGeneric(RenderMissileType.TYPE_THERMAL)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_exo, new ItemRenderMissileGeneric(RenderMissileType.TYPE_THERMAL)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_doomsday, new ItemRenderMissileGeneric(RenderMissileType.TYPE_DOOMSDAY)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_carrier, new ItemRenderMissileGeneric(RenderMissileType.TYPE_CARRIER)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_shuttle, new ItemRenderMissileGeneric(RenderMissileType.TYPE_ROBIN)); //test crap MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ModBlocks.test_bomb_advanced), new ItemRenderTestBombAdvanced()); diff --git a/src/main/java/com/hbm/render/item/ItemRenderMissileGeneric.java b/src/main/java/com/hbm/render/item/ItemRenderMissileGeneric.java new file mode 100644 index 000000000..64763d78b --- /dev/null +++ b/src/main/java/com/hbm/render/item/ItemRenderMissileGeneric.java @@ -0,0 +1,192 @@ +package com.hbm.render.item; + +import java.util.HashMap; +import java.util.function.Consumer; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.items.ModItems; +import com.hbm.main.ResourceManager; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.client.model.IModelCustom; + +public class ItemRenderMissileGeneric implements IItemRenderer { + + public static HashMap> renderers = new HashMap(); + + protected RenderMissileType type; + + public static enum RenderMissileType { + TYPE_TIER0, + TYPE_TIER1, + TYPE_TIER2, + TYPE_TIER3, + TYPE_STEALTH, + TYPE_ABM, + TYPE_NUCLEAR, + TYPE_THERMAL, + TYPE_DOOMSDAY, + TYPE_CARRIER, + TYPE_ROBIN + } + + public ItemRenderMissileGeneric(RenderMissileType type) { + this.type = type; + } + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + switch(type) { + case EQUIPPED: + case EQUIPPED_FIRST_PERSON: + case ENTITY: + case INVENTORY: + return true; + default: return false; + } + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return helper == ItemRendererHelper.ENTITY_BOBBING || helper == ItemRendererHelper.ENTITY_ROTATION; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + + Consumer renderer = renderers.get(new ComparableStack(item).makeSingular()); + if(renderer == null) return; + + GL11.glPushMatrix(); + + double guiScale = 1; + double guiOffset = 0; + + switch(this.type) { + case TYPE_TIER0: guiScale = 2.25D; guiOffset = 7.5D; break; + case TYPE_TIER1: guiScale = 2.5D; guiOffset = 8.5D; break; + case TYPE_TIER2: guiScale = 2D; guiOffset = 6.5D; break; + case TYPE_TIER3: guiScale = 1.25D; guiOffset = 1D; break; + case TYPE_STEALTH: guiScale = 1.75D; guiOffset = 4.75D; break; + case TYPE_ABM: guiScale = 2.25D; guiOffset = 7D; break; + case TYPE_NUCLEAR: guiScale = 1.75D; guiOffset = 4D; break; + case TYPE_THERMAL: guiScale = 1.75D; guiOffset = 4.5D; break; + case TYPE_DOOMSDAY: guiScale = 1.5D; guiOffset = 3D; break; + case TYPE_CARRIER: guiScale = 0.625D; guiOffset = -17D; break; + case TYPE_ROBIN: guiScale = 1.25D; guiOffset = 2D; break; + } + + switch(type) { + case EQUIPPED: + double s = 0.15; + GL11.glTranslated(0.5, -0.25, 0); + GL11.glScaled(s, s, s); + break; + case EQUIPPED_FIRST_PERSON: + double heldScale = 0.1; + GL11.glTranslated(0.5, 0.25, 0); + GL11.glScaled(heldScale, heldScale, heldScale); + break; + case ENTITY: + double s2 = 0.15; + GL11.glScaled(s2, s2, s2); + break; + case INVENTORY: + RenderHelper.enableGUIStandardItemLighting(); + GL11.glScaled(guiScale, guiScale, guiScale); + GL11.glRotated(135, 0, 0, 1); + GL11.glRotatef(System.currentTimeMillis() / 15 % 360, 0, 1, 0); + GL11.glTranslated(0, -16 + guiOffset, 0); + break; + default: break; + } + + GL11.glDisable(GL11.GL_CULL_FACE); + renderer.accept(Minecraft.getMinecraft().renderEngine); + GL11.glEnable(GL11.GL_CULL_FACE); + + GL11.glPopMatrix(); + } + + public static Consumer generateStandard(ResourceLocation texture, IModelCustom model) { return generateWithScale(texture, model, 1F); } + public static Consumer generateLarge(ResourceLocation texture, IModelCustom model) { return generateWithScale(texture, model, 1.5F); } + public static Consumer generateDouble(ResourceLocation texture, IModelCustom model) { return generateWithScale(texture, model, 2F); } + + public static Consumer generateWithScale(ResourceLocation texture, IModelCustom model, float scale) { + return x -> { + GL11.glScalef(scale, scale, scale); + GL11.glShadeModel(GL11.GL_SMOOTH); + x.bindTexture(texture); model.renderAll(); + GL11.glShadeModel(GL11.GL_FLAT); + }; + } + + public static void init() { + + renderers.put(new ComparableStack(ModItems.missile_taint), generateDouble(ResourceManager.missileTaint_tex, ResourceManager.missileTaint)); + renderers.put(new ComparableStack(ModItems.missile_micro), generateDouble(ResourceManager.missileMicro_tex, ResourceManager.missileTaint)); + renderers.put(new ComparableStack(ModItems.missile_bhole), generateDouble(ResourceManager.missileMicroBHole_tex, ResourceManager.missileTaint)); + renderers.put(new ComparableStack(ModItems.missile_schrabidium), generateDouble(ResourceManager.missileMicroSchrab_tex, ResourceManager.missileTaint)); + renderers.put(new ComparableStack(ModItems.missile_emp), generateDouble(ResourceManager.missileMicroEMP_tex, ResourceManager.missileTaint)); + + renderers.put(new ComparableStack(ModItems.missile_stealth), x -> { + GL11.glShadeModel(GL11.GL_SMOOTH); + x.bindTexture(ResourceManager.missileStealth_tex); ResourceManager.missileStealth.renderAll(); + GL11.glShadeModel(GL11.GL_FLAT); + }); + + renderers.put(new ComparableStack(ModItems.missile_generic), generateStandard(ResourceManager.missileV2_HE_tex, ResourceManager.missileV2)); + renderers.put(new ComparableStack(ModItems.missile_incendiary), generateStandard(ResourceManager.missileV2_IN_tex, ResourceManager.missileV2)); + renderers.put(new ComparableStack(ModItems.missile_cluster), generateStandard(ResourceManager.missileV2_CL_tex, ResourceManager.missileV2)); + renderers.put(new ComparableStack(ModItems.missile_buster), generateStandard(ResourceManager.missileV2_BU_tex, ResourceManager.missileV2)); + renderers.put(new ComparableStack(ModItems.missile_decoy), generateStandard(ResourceManager.missileV2_decoy_tex, ResourceManager.missileV2)); + renderers.put(new ComparableStack(ModItems.missile_anti_ballistic), generateStandard(ResourceManager.missileAA_tex, ResourceManager.missileABM)); + + renderers.put(new ComparableStack(ModItems.missile_strong), generateLarge(ResourceManager.missileStrong_HE_tex, ResourceManager.missileStrong)); + renderers.put(new ComparableStack(ModItems.missile_incendiary_strong), generateLarge(ResourceManager.missileStrong_IN_tex, ResourceManager.missileStrong)); + renderers.put(new ComparableStack(ModItems.missile_cluster_strong), generateLarge(ResourceManager.missileStrong_CL_tex, ResourceManager.missileStrong)); + renderers.put(new ComparableStack(ModItems.missile_buster_strong), generateLarge(ResourceManager.missileStrong_BU_tex, ResourceManager.missileStrong)); + renderers.put(new ComparableStack(ModItems.missile_emp_strong), generateLarge(ResourceManager.missileStrong_EMP_tex, ResourceManager.missileStrong)); + + renderers.put(new ComparableStack(ModItems.missile_burst), generateStandard(ResourceManager.missileHuge_HE_tex, ResourceManager.missileHuge)); + renderers.put(new ComparableStack(ModItems.missile_inferno), generateStandard(ResourceManager.missileHuge_IN_tex, ResourceManager.missileHuge)); + renderers.put(new ComparableStack(ModItems.missile_rain), generateStandard(ResourceManager.missileHuge_CL_tex, ResourceManager.missileHuge)); + renderers.put(new ComparableStack(ModItems.missile_drill), generateStandard(ResourceManager.missileHuge_BU_tex, ResourceManager.missileHuge)); + + renderers.put(new ComparableStack(ModItems.missile_nuclear), generateLarge(ResourceManager.missileNuclear_tex, ResourceManager.missileNuclear)); + renderers.put(new ComparableStack(ModItems.missile_nuclear_cluster), generateLarge(ResourceManager.missileMIRV_tex, ResourceManager.missileNuclear)); + renderers.put(new ComparableStack(ModItems.missile_volcano), generateLarge(ResourceManager.missileVolcano_tex, ResourceManager.missileNuclear)); + + renderers.put(new ComparableStack(ModItems.missile_endo), generateLarge(ResourceManager.missileEndo_tex, ResourceManager.missileThermo)); + renderers.put(new ComparableStack(ModItems.missile_exo), generateLarge(ResourceManager.missileExo_tex, ResourceManager.missileThermo)); + + renderers.put(new ComparableStack(ModItems.missile_doomsday), generateDouble(ResourceManager.missileDoomsday_tex, ResourceManager.missileDoomsday)); + + renderers.put(new ComparableStack(ModItems.missile_carrier), x -> { + GL11.glScalef(2F, 2F, 2F); + x.bindTexture(ResourceManager.missileCarrier_tex); + ResourceManager.missileCarrier.renderAll(); + GL11.glTranslated(0.0D, 0.5D, 0.0D); + GL11.glTranslated(1.25D, 0.0D, 0.0D); + x.bindTexture(ResourceManager.missileBooster_tex); + ResourceManager.missileBooster.renderAll(); + GL11.glTranslated(-2.5D, 0.0D, 0.0D); + ResourceManager.missileBooster.renderAll(); + GL11.glTranslated(1.25D, 0.0D, 0.0D); + GL11.glTranslated(0.0D, 0.0D, 1.25D); + ResourceManager.missileBooster.renderAll(); + GL11.glTranslated(0.0D, 0.0D, -2.5D); + ResourceManager.missileBooster.renderAll(); + GL11.glTranslated(0.0D, 0.0D, 1.25D); + }); + + renderers.put(new ComparableStack(ModItems.missile_shuttle), generateStandard(ResourceManager.missileShuttle_tex, ResourceManager.missileShuttle)); + } +} diff --git a/src/main/java/com/hbm/render/item/ItemRendererMeteorSword.java b/src/main/java/com/hbm/render/item/ItemRendererMeteorSword.java index fa0dc5387..27834f8e0 100644 --- a/src/main/java/com/hbm/render/item/ItemRendererMeteorSword.java +++ b/src/main/java/com/hbm/render/item/ItemRendererMeteorSword.java @@ -6,10 +6,14 @@ import com.hbm.render.util.RenderItemStack; import com.hbm.render.util.RenderMiscEffects; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.TextureUtil; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; import net.minecraftforge.client.IItemRenderer; public class ItemRendererMeteorSword implements IItemRenderer { @@ -17,16 +21,16 @@ public class ItemRendererMeteorSword implements IItemRenderer { float r; float g; float b; - + public ItemRendererMeteorSword(float r, float g, float b) { this.r = r; this.g = g; this.b = b; } - + @Override public boolean handleRenderType(ItemStack stack, ItemRenderType type) { - return type == ItemRenderType.INVENTORY; + return type != ItemRenderType.ENTITY; } @Override @@ -39,56 +43,138 @@ public class ItemRendererMeteorSword implements IItemRenderer { GL11.glPushMatrix(); RenderHelper.enableGUIStandardItemLighting(); - Minecraft mc = Minecraft.getMinecraft(); - RenderItemStack.renderItem.renderItemIntoGUI(mc.fontRenderer, mc.renderEngine, item, 0, 0); + switch(type) { - mc.renderEngine.bindTexture(RenderMiscEffects.glint); + case EQUIPPED_FIRST_PERSON: + GL11.glRotated(180, 0, 1, 0); + GL11.glRotated(-90, 0, 0, 1); + GL11.glTranslated(0.5, 0.5, 0); + GL11.glTranslated(-0.5, -0.5, 0); + GL11.glRotated(180, 0, 1, 0); + GL11.glRotated(-90, 0, 0, 1); + GL11.glTranslated(0.5, 0.5, 0); + GL11.glScaled(1.36 * 2, 1.36 * 2, 0.68 * 2); + GL11.glTranslated(-0.5, -0.5, 0.25); + break; + case EQUIPPED: + GL11.glRotated(180, 0, 1, 0); + GL11.glRotated(-90, 0, 0, 1); + GL11.glTranslated(0.2, 0.55, 0); + GL11.glRotated(45, 0, 0, 1); + GL11.glRotated(180, 0, 1, 0); + GL11.glRotated(-45, 0, 0, 1); + GL11.glScaled(1.7, 1.7, 0.85); + break; + case INVENTORY: + break; + + default: break; + } - GL11.glDepthFunc(GL11.GL_EQUAL); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glDepthMask(false); - GL11.glEnable(GL11.GL_ALPHA_TEST); - GL11.glEnable(GL11.GL_BLEND); - - for (int j1 = 0; j1 < 2; ++j1) { - OpenGlHelper.glBlendFunc(772, 1, 0, 0); - float f = 0.00390625F; - float f1 = 0.00390625F; - float f2 = (float)(Minecraft.getSystemTime() % (long)(3000 + j1 * 1873)) / (3000.0F + (float)(j1 * 1873)) * 256.0F; - float f3 = 0.0F; - Tessellator tessellator = Tessellator.instance; - float f4 = 4.0F; + if(data.length > 1 && data[1] instanceof EntityLivingBase) { + EntityLivingBase entity = (EntityLivingBase) data[1]; + IIcon iicon = entity.getItemIcon(item, 0); - if (j1 == 1) - { - f4 = -1.0F; - } - - float in = 0.36F; - - GL11.glColor4f(r * in, g * in, b * in, 1.0F); - - int p_77018_2_ = 0; - int p_77018_4_ = 16; - int p_77018_3_ = 0; - int p_77018_5_ = 16; - int zLevel = 0; + if(iicon == null) { + return; + } - tessellator.startDrawingQuads(); - tessellator.addVertexWithUV((double)(p_77018_2_ + 0), (double)(p_77018_3_ + p_77018_5_), (double)zLevel, (double)((f2 + (float)p_77018_5_ * f4) * f), (double)((f3 + (float)p_77018_5_) * f1)); - tessellator.addVertexWithUV((double)(p_77018_2_ + p_77018_4_), (double)(p_77018_3_ + p_77018_5_), (double)zLevel, (double)((f2 + (float)p_77018_4_ + (float)p_77018_5_ * f4) * f), (double)((f3 + (float)p_77018_5_) * f1)); - tessellator.addVertexWithUV((double)(p_77018_2_ + p_77018_4_), (double)(p_77018_3_ + 0), (double)zLevel, (double)((f2 + (float)p_77018_4_) * f), (double)((f3 + 0.0F) * f1)); - tessellator.addVertexWithUV((double)(p_77018_2_ + 0), (double)(p_77018_3_ + 0), (double)zLevel, (double)((f2 + 0.0F) * f), (double)((f3 + 0.0F) * f1)); - tessellator.draw(); - } + Minecraft.getMinecraft().getTextureManager().bindTexture(Minecraft.getMinecraft().getTextureManager().getResourceLocation(item.getItemSpriteNumber())); + TextureUtil.func_152777_a(false, false, 1.0F); + Tessellator tessellator = Tessellator.instance; + ItemRenderer.renderItemIn2D(tessellator, iicon.getMaxU(), iicon.getMinV(), iicon.getMinU(), iicon.getMaxV(), iicon.getIconWidth(), iicon.getIconHeight(), 0.0625F); + renderGlint3D(tessellator, 0.0625F); + } else { + RenderItemStack.renderItemStackNoEffect(0, 0, 0, item); + renderGlintFlat(); + } - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glDepthMask(true); - GL11.glDisable(GL11.GL_BLEND); - GL11.glDisable(GL11.GL_ALPHA_TEST); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDepthFunc(GL11.GL_LEQUAL); - GL11.glPopMatrix(); } + + public void renderGlintFlat() { + + Minecraft mc = Minecraft.getMinecraft(); + mc.renderEngine.bindTexture(RenderMiscEffects.glint); + + GL11.glDepthFunc(GL11.GL_EQUAL); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDepthMask(false); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_BLEND); + + for(int j1 = 0; j1 < 2; ++j1) { + OpenGlHelper.glBlendFunc(772, 1, 0, 0); + float scaleU = 0.00390625F; + float scaleV = 0.00390625F; + float anim = (float) (Minecraft.getSystemTime() % (long) (3000 + j1 * 1873)) / (3000.0F + (float) (j1 * 1873)) * 256.0F; + float offsetV = 0.0F; + Tessellator tessellator = Tessellator.instance; + float sizeMultU = 4.0F; + + if(j1 == 1) { + sizeMultU = -1.0F; + } + + float in = 0.36F; + GL11.glColor4f(r * in, g * in, b * in, 1.0F); + + int x = 0; + int sizeX = 16; + int y = 0; + int sizeY = 16; + int zLevel = 0; + + tessellator.startDrawingQuads(); + tessellator.addVertexWithUV(x + 0, y + sizeY, zLevel, (anim + sizeY * sizeMultU) * scaleU, (offsetV + sizeY) * scaleV); + tessellator.addVertexWithUV(x + sizeX, y + sizeY, zLevel, (anim + sizeX + sizeY * sizeMultU) * scaleU, (offsetV + sizeY) * scaleV); + tessellator.addVertexWithUV(x + sizeX, y + 0, zLevel, (anim + sizeX) * scaleU, (offsetV + 0.0F) * scaleV); + tessellator.addVertexWithUV(x + 0, y + 0, zLevel, (anim + 0.0F) * scaleU, (offsetV + 0.0F) * scaleV); + tessellator.draw(); + } + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glDepthMask(true); + GL11.glDisable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDepthFunc(GL11.GL_LEQUAL); + } + + public void renderGlint3D(Tessellator tessellator, float depth) { + + Minecraft mc = Minecraft.getMinecraft(); + mc.renderEngine.bindTexture(RenderMiscEffects.glint); + + GL11.glDepthFunc(GL11.GL_EQUAL); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); + + float in = 0.36F; + GL11.glColor4f(r * in, g * in, b * in, 1.0F); + + GL11.glMatrixMode(GL11.GL_TEXTURE); + + GL11.glPushMatrix(); + float scale = 0.125F; + GL11.glScalef(scale, scale, scale); + float offset = (float) (Minecraft.getSystemTime() % 3000L) / 3000.0F * 8.0F; + GL11.glTranslatef(offset, 0.0F, 0.0F); + GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); + ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 255, 255, depth); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + GL11.glScalef(scale, scale, scale); + offset = (float) (Minecraft.getSystemTime() % 4873L) / 4873.0F * 8.0F; + GL11.glTranslatef(-offset, 0.0F, 0.0F); + GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); + ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 255, 255, depth); + GL11.glPopMatrix(); + + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDepthFunc(GL11.GL_LEQUAL); + } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderLaunchPadTier1.java b/src/main/java/com/hbm/render/tileentity/RenderLaunchPadTier1.java index f2b5f3cb8..fe97935ec 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderLaunchPadTier1.java +++ b/src/main/java/com/hbm/render/tileentity/RenderLaunchPadTier1.java @@ -1,11 +1,15 @@ package com.hbm.render.tileentity; +import java.util.function.Consumer; + import org.lwjgl.opengl.GL11; -import com.hbm.items.ModItems; +import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderMissileGeneric; import com.hbm.tileentity.bomb.TileEntityLaunchPad; +import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -29,188 +33,8 @@ public class RenderLaunchPadTier1 extends TileEntitySpecialRenderer { if(toRender != null) { GL11.glTranslated(0, 1, 0); - - //TODO: add a registry for missile rendering to be reused here and for the entity renderer - if(toRender.getItem() == ModItems.missile_generic) { - bindTexture(ResourceManager.missileV2_HE_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileV2.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_decoy) { - bindTexture(ResourceManager.missileV2_decoy_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileV2.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_stealth) { - bindTexture(ResourceManager.missileStealth_tex); - ResourceManager.missileStealth.renderAll(); - } - if(toRender.getItem() == ModItems.missile_strong) { - GL11.glScalef(1.5F, 1.5F, 1.5F); - bindTexture(ResourceManager.missileStrong_HE_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileStrong.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_cluster) { - GL11.glScalef(1.0F, 1.0F, 1.0F); - bindTexture(ResourceManager.missileV2_CL_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileV2.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_nuclear) { - GL11.glScalef(1.5F, 1.5F, 1.5F); - bindTexture(ResourceManager.missileNuclear_tex); - ResourceManager.missileNuclear.renderAll(); - } - if(toRender.getItem() == ModItems.missile_incendiary) { - GL11.glScalef(1.0F, 1.0F, 1.0F); - bindTexture(ResourceManager.missileV2_IN_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileV2.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_buster) { - GL11.glScalef(1.0F, 1.0F, 1.0F); - bindTexture(ResourceManager.missileV2_BU_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileV2.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_incendiary_strong) { - GL11.glScalef(1.5F, 1.5F, 1.5F); - bindTexture(ResourceManager.missileStrong_IN_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileStrong.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_cluster_strong) { - GL11.glScalef(1.5F, 1.5F, 1.5F); - bindTexture(ResourceManager.missileStrong_CL_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileStrong.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_buster_strong) { - GL11.glScalef(1.5F, 1.5F, 1.5F); - bindTexture(ResourceManager.missileStrong_BU_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileStrong.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_burst) { - bindTexture(ResourceManager.missileHuge_HE_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileHuge.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_inferno) { - bindTexture(ResourceManager.missileHuge_IN_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileHuge.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_rain) { - bindTexture(ResourceManager.missileHuge_CL_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileHuge.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_drill) { - bindTexture(ResourceManager.missileHuge_BU_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileHuge.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_endo) { - GL11.glScalef(1.5F, 1.5F, 1.5F); - bindTexture(ResourceManager.missileEndo_tex); - ResourceManager.missileThermo.renderAll(); - } - if(toRender.getItem() == ModItems.missile_exo) { - GL11.glScalef(1.5F, 1.5F, 1.5F); - bindTexture(ResourceManager.missileExo_tex); - ResourceManager.missileThermo.renderAll(); - } - if(toRender.getItem() == ModItems.missile_nuclear_cluster) { - GL11.glScalef(1.5F, 1.5F, 1.5F); - bindTexture(ResourceManager.missileMIRV_tex); - ResourceManager.missileNuclear.renderAll(); - } - if(toRender.getItem() == ModItems.missile_doomsday) { - GL11.glScalef(2F, 2F, 2F); - bindTexture(ResourceManager.missileDoomsday_tex); - ResourceManager.missileDoomsday.renderAll(); - } - if(toRender.getItem() == ModItems.missile_taint) { - GL11.glScalef(2F, 2F, 2F); - bindTexture(ResourceManager.missileTaint_tex); - ResourceManager.missileTaint.renderAll(); - } - if(toRender.getItem() == ModItems.missile_micro) { - GL11.glScalef(2F, 2F, 2F); - bindTexture(ResourceManager.missileMicro_tex); - ResourceManager.missileTaint.renderAll(); - } - if(toRender.getItem() == ModItems.missile_carrier) { - GL11.glScalef(2F, 2F, 2F); - bindTexture(ResourceManager.missileCarrier_tex); - ResourceManager.missileCarrier.renderAll(); - GL11.glTranslated(0.0D, 0.5D, 0.0D); - GL11.glTranslated(1.25D, 0.0D, 0.0D); - bindTexture(ResourceManager.missileBooster_tex); - ResourceManager.missileBooster.renderAll(); - GL11.glTranslated(-2.5D, 0.0D, 0.0D); - ResourceManager.missileBooster.renderAll(); - GL11.glTranslated(1.25D, 0.0D, 0.0D); - GL11.glTranslated(0.0D, 0.0D, 1.25D); - ResourceManager.missileBooster.renderAll(); - GL11.glTranslated(0.0D, 0.0D, -2.5D); - ResourceManager.missileBooster.renderAll(); - GL11.glTranslated(0.0D, 0.0D, 1.25D); - } - if(toRender.getItem() == ModItems.missile_anti_ballistic) { - GL11.glScalef(1.0F, 1.0F, 1.0F); - bindTexture(ResourceManager.missileAA_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileABM.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_bhole) { - GL11.glScalef(2F, 2F, 2F); - bindTexture(ResourceManager.missileMicroBHole_tex); - ResourceManager.missileTaint.renderAll(); - } - if(toRender.getItem() == ModItems.missile_schrabidium) { - GL11.glScalef(2F, 2F, 2F); - bindTexture(ResourceManager.missileMicroSchrab_tex); - ResourceManager.missileTaint.renderAll(); - } - if(toRender.getItem() == ModItems.missile_emp) { - GL11.glScalef(2F, 2F, 2F); - bindTexture(ResourceManager.missileMicroEMP_tex); - ResourceManager.missileTaint.renderAll(); - } - if(toRender.getItem() == ModItems.missile_emp_strong) { - GL11.glScalef(1.5F, 1.5F, 1.5F); - bindTexture(ResourceManager.missileStrong_EMP_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileStrong.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_volcano) { - GL11.glScalef(1.5F, 1.5F, 1.5F); - bindTexture(ResourceManager.missileVolcano_tex); - ResourceManager.missileNuclear.renderAll(); - } - if(toRender.getItem() == ModItems.missile_shuttle) { - GL11.glScalef(1.0F, 1.0F, 1.0F); - bindTexture(ResourceManager.missileShuttle_tex); - ResourceManager.missileShuttle.renderAll(); - } + Consumer renderer = ItemRenderMissileGeneric.renderers.get(new ComparableStack(toRender).makeSingular()); + renderer.accept(this.field_147501_a.field_147553_e); } } diff --git a/src/main/java/com/hbm/tileentity/IUpgradeInfoProvider.java b/src/main/java/com/hbm/tileentity/IUpgradeInfoProvider.java index f1a420b5f..90a348e1c 100644 --- a/src/main/java/com/hbm/tileentity/IUpgradeInfoProvider.java +++ b/src/main/java/com/hbm/tileentity/IUpgradeInfoProvider.java @@ -22,8 +22,10 @@ public interface IUpgradeInfoProvider { public static final String KEY_ACID = "upgrade.acid"; public static final String KEY_BURN = "upgrade.burn"; public static final String KEY_CONSUMPTION = "upgrade.consumption"; + public static final String KEY_COOLANT_CONSUMPTION = "upgrade.coolantConsumption"; public static final String KEY_DELAY = "upgrade.delay"; public static final String KEY_EFFICIENCY = "upgrade.efficiency"; public static final String KEY_FORTUNE = "upgrade.fortune"; + public static final String KEY_OVERHEAT_CHANCE = "upgrade.overheatChance"; public static final String KEY_RANGE = "upgrade.range"; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java index 9d30a9f22..f5a489a8c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java @@ -3,6 +3,7 @@ package com.hbm.tileentity.machine; import java.util.List; import java.util.Map.Entry; +import com.hbm.blocks.ModBlocks; import com.hbm.config.BombConfig; import com.hbm.entity.effect.EntityBlackHole; import com.hbm.entity.logic.EntityBalefire; @@ -21,12 +22,15 @@ import com.hbm.inventory.gui.GUIMachineCyclotron; import com.hbm.inventory.recipes.CyclotronRecipes; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; +import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IConditionalInvAccess; import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.I18nUtil; import com.hbm.util.Tuple.Pair; import com.hbm.util.fauxpointtwelve.DirPos; @@ -42,14 +46,15 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineCyclotron extends TileEntityMachineBase implements IFluidSource, IFluidAcceptor, IEnergyUser, IFluidStandardTransceiver, IGUIProvider, IConditionalInvAccess { +public class TileEntityMachineCyclotron extends TileEntityMachineBase implements IFluidSource, IFluidAcceptor, IEnergyUser, IFluidStandardTransceiver, IGUIProvider, IConditionalInvAccess, IUpgradeInfoProvider { public long power; public static final long maxPower = 100000000; - public int consumption = 1000000; + public int consumption = 1_000_000; public boolean isOn; @@ -98,7 +103,7 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements if(isOn) { - int defConsumption = consumption - 100000 * getConsumption(); + int defConsumption = consumption - 100_000 * getConsumption(); if(canProcess() && power >= defConsumption) { @@ -111,14 +116,16 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements this.markDirty(); } + int safety = this.getSafety(); + if(coolant.getFill() > 0) { countdown = 0; - if(worldObj.rand.nextInt(3) == 0) + if(worldObj.rand.nextInt(3 * safety) == 0) coolant.setFill(coolant.getFill() - 1); - } else if(worldObj.rand.nextInt(this.getSafety()) == 0) { + } else if(worldObj.rand.nextInt(safety) == 0) { countdown++; @@ -576,4 +583,32 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements return new int[] {6, 7, 8}; } + + @Override + public boolean canProvideInfo(UpgradeType type, int level, boolean extendedInfo) { + return type == UpgradeType.SPEED || type == UpgradeType.POWER || type == UpgradeType.EFFECT; + } + + @Override + public void provideInfo(UpgradeType type, int level, List info, boolean extendedInfo) { + info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.machine_cyclotron)); + if(type == UpgradeType.SPEED) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_DELAY, "-" + (100 - 100 / (level + 1)) + "%")); + } + if(type == UpgradeType.POWER) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_CONSUMPTION, "-" + (level * 10) + "%")); + } + if(type == UpgradeType.EFFECT) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_COOLANT_CONSUMPTION, "-" + (100 - 100 / (level + 1)) + "%")); + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_OVERHEAT_CHANCE, "-" + (100 - 100 / (level + 1)) + "%")); + } + } + + @Override + public int getMaxLevel(UpgradeType type) { + if(type == UpgradeType.SPEED) return 3; + if(type == UpgradeType.POWER) return 3; + if(type == UpgradeType.EFFECT) return 3; + return 0; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java index 87ba3eb7f..04064d367 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java @@ -852,7 +852,7 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements public void provideInfo(UpgradeType type, int level, List info, boolean extendedInfo) { info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.machine_excavator)); if(type == UpgradeType.SPEED) { - info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_DELAY, "-" + (100 - 100 / (level / 2 + 1)) + "%")); + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_DELAY, "-" + (100 - 200 / (level + 2)) + "%")); info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(this.KEY_CONSUMPTION, "+" + (level * 100) + "%")); } if(type == UpgradeType.POWER) { diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 1cb4290c0..1ab2a42b8 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5668,9 +5668,11 @@ turret.players=Target Players: %s upgrade.acid=Acid required %s upgrade.burn=Burn %smb/t for %sHE upgrade.consumption=Consumption %s +upgrade.coolantConsumption=Coolant Consumption %s upgrade.delay=Process time %s upgrade.efficiency=Efficiency %s upgrade.fortune=Fortune %s +upgrade.overheatChance=Overheat chance %s upgrade.range=Range %s upgrade.gui.title=§lAcceptable Upgrades:§r From 873810965d46f0fe42c63c186f1773afd26b02e6 Mon Sep 17 00:00:00 2001 From: Doctor17-git <60807716+Doctor17-git@users.noreply.github.com> Date: Mon, 15 Jan 2024 17:52:28 +0300 Subject: [PATCH 19/30] Updated ru_RU.lang updated russian localization --- src/main/resources/assets/hbm/lang/ru_RU.lang | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 82de31e27..a58c2dd5d 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -1790,6 +1790,7 @@ tile.turret_tau.name=Турель с тау-пушкой tile.turret_spitfire.name=Турель без названия [WIP] tile.turret_cwis.name=”Фэленкс” Mk-15 CIWS tile.turret_cheapo.name=Дешёвая пулемётная турель +tile.machine_radar_large.name=Большой радар tile.machine_radar.name=Радар container.radar=Радар item.radar_linker.name=Радарный соединитель @@ -1985,8 +1986,8 @@ tile.machine_excavator.name=Большой горный бур tile.machine_assembler.name=Сборочная машина container.assembler=Сборочная машина tile.machine_assemfac.name=Сборочный завод -tile.machine_autocrafter.name=Стол автокрафта -container.autocrafter=Стол автокрафта +tile.machine_autocrafter.name=Автоматический верстак +container.autocrafter=Автоматический верстак container.machineFunnel=Комбинаторная воронка tile.machine_funnel.name=Комбинаторная воронка tile.machine_funnel.descАвтоматически сжимает предметы в сетке 2x2 или 3x3 для крафтинга$Верх: Вход$Низ: Выход$Бок: Выход для очистки ингредиентов @@ -2130,6 +2131,8 @@ tile.machine_liquefactor.desc=Мощная машина для превраще container.machineSolidifier=Отвердитель tile.machine_solidifier.name=Промышленный отвердитель tile.machine_solidifier.desc=Универсальная машина, оснащенная системами охлаждения и другими$универсальными инструментами для превращения жидкостей в твердые вещества с использованием различных$процессов, таких как замораживание и нефтехимическая полимеризация. +container.machineStrandCaster=Машина непрерывного литья заготовок +tile.machine_strand_caster.name=Машина непрерывного литья заготовок tile.conveyor.name=Конвейер tile.conveyor.desc=Moves items dropped on it$Can be rotated clockwise with a screwdriver$Shift-click with screwdriver to bend @@ -3191,6 +3194,10 @@ tile.ore_cobalt.name=Кобальтовая руда tile.stone_porous.name=Пористый камень tile.ore_random.name=Руда %s tile.ore_bedrock.name=Бедроковая руда +tile.ore_sellafield_diamond.name=Селлафитовая алмазная руда +tile.ore_sellafield_emerald.name=Селлафитовая изумрудная руда +tile.ore_sellafield_schrabidium.name=Селлафитовая шрабидиевая руда +tile.ore_sellafield_uranium_scorched.name=Обожженная селлафитовая урановая руда item.ore.asbestos=Асбестовая item.ore.borax=Буровая @@ -3816,6 +3823,14 @@ item.fluid_barrel_full.name=Жидкостная бочка: item.fluid_tank_lead_empty.name=Пустой резервуар для опасных материалов item.fluid_tank_lead_full.name=Резервуар с опасными материалами: item.fluid_barrel_infinite.name=Бесконечная жидкостная бочка +desc.item.pileRod=§eПКМ по просверленному графиту для вставки$§eПКМ отвёрткой чтобы извлечь$ +desc.item.pipette.corrosive=Может работать с коррозийными жидкостями. +desc.item.pipette.laboratory=Теперь с 50-кратной точностью! +desc.item.pipette.noCorrosive=§eНе может работать с коррозийными жидкостями. +desc.item.pipette.noEmpty=§eПипетка не пуста! +item.pipette.name=Пипетка +item.pipette_boron.name=Борная пипетка +item.pipette_laboratory.name=Лабораторная пипетка item.rod_of_discord.name=Жезл раздора item.rod_empty.name=Пустой стержень From 7b6a9ffa607706e710d880d4816a6b3b7f9fda0f Mon Sep 17 00:00:00 2001 From: Doctor17-git <60807716+Doctor17-git@users.noreply.github.com> Date: Mon, 15 Jan 2024 17:54:02 +0300 Subject: [PATCH 20/30] h --- src/main/resources/assets/hbm/lang/ru_RU.lang | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index a58c2dd5d..cda7cdfa9 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -1463,6 +1463,8 @@ upgrade.delay=Время %s upgrade.efficiency=Эффективность %s upgrade.fortune=Удача %s upgrade.range=Радиус %s +upgrade.coolantConsumption=Потребление охладителя %s +upgrade.overheatChance=Шанс перегрева %s upgrade.gui.title=§lПринимаемые улучшения:§r upgrade.gui.afterburner= * §dФорсаж§r: Стакается до %s уровней From e62955f667fe3fe780b615315105268677f2be71 Mon Sep 17 00:00:00 2001 From: Bob Date: Mon, 15 Jan 2024 19:53:35 +0100 Subject: [PATCH 21/30] radar fixes --- changelog | 4 ++ gradle.properties | 2 +- .../java/com/hbm/inventory/gui/GUIFunnel.java | 28 +++++++++- src/main/java/com/hbm/lib/RefStrings.java | 2 +- .../render/tileentity/RenderRadarScreen.java | 5 +- .../machine/TileEntityMachineFunnel.java | 50 ++++++++++++++++-- .../machine/TileEntityMachineRadarLarge.java | 22 ++++++++ .../machine/TileEntityMachineRadarNT.java | 10 +--- .../machine/TileEntityMachineRadarScreen.java | 3 ++ .../textures/gui/processing/gui_funnel.png | Bin 1164 -> 1486 bytes 10 files changed, 108 insertions(+), 18 deletions(-) diff --git a/changelog b/changelog index 7293090d2..4ed8554c2 100644 --- a/changelog +++ b/changelog @@ -6,6 +6,7 @@ * Capacity can be changed by right-clicking if the pipette is empty ## Changed +* Updated russian localization * There is now a config option to disable the biome change caused by fallout. The config will also determine whether the biomes are registered at all, which prevents them from conflicting with other mods' biomes when disabled. * Chemical plants now have a timer that starts after loading/unloading fluids using item fluid containers from the input buffers, this creates a delay between switching from loading and unloading, making it possible to retrieve fluids using pipettes. * In addition to delaying overheats, efficiency upgrades now reduce the cyclotron's coolant demand @@ -13,6 +14,7 @@ * Meteorite swords now render their variant glint in first person view * Meteorite swords are now a lot larger, similar to most other NTM swords * Non-custom missile items now render in 3D +* Combinator funnels can now be configured whether to only do 3x3, 2x2 or both recipe types ## Fixed * Fixed trenchmaster armor not doing most of the armor calculation, making it the worst armor @@ -21,3 +23,5 @@ * Fixed fallout being able to replace bedrock * Fixed the upgrade info of the large mining drill being incorrect * Fixed cyclotron not having the new upgrade info tooltip +* Fixed the large radar not actually having a larger scan range +* Fixed radar blips going out of bounds when using a radar screen with a large radar or a radar with a different config diff --git a/gradle.properties b/gradle.properties index 1b2ab7ac0..963b4f95a 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=4844 +mod_build_number=4845 credits=HbMinecraft, rodolphito (explosion algorithms), grangerave (explosion algorithms),\ \ Hoboy (textures, models), Doctor17 (russian localization), Drillgon200 (effects, models,\ diff --git a/src/main/java/com/hbm/inventory/gui/GUIFunnel.java b/src/main/java/com/hbm/inventory/gui/GUIFunnel.java index 1ee5069b3..817be3b10 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIFunnel.java +++ b/src/main/java/com/hbm/inventory/gui/GUIFunnel.java @@ -4,15 +4,18 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerFunnel; import com.hbm.lib.RefStrings; +import com.hbm.packet.NBTControlPacket; +import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.machine.TileEntityMachineFunnel; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; -public class GUIFunnel extends GuiContainer { +public class GUIFunnel extends GuiInfoContainer { private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_funnel.png"); private TileEntityMachineFunnel funnel; @@ -24,6 +27,25 @@ public class GUIFunnel extends GuiContainer { this.xSize = 176; this.ySize = 168; } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 159, guiTop + 73, 10, 10, mouseX, mouseY, "Mode: " + (funnel.mode == funnel.MODE_3x3 ? "3x3 only" : funnel.mode == funnel.MODE_2x2 ? "2x2 only" : "3x3 then 2x2")); + } + + @Override + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + + if(this.checkClick(x, y, 159, 73, 10, 10)) { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + NBTTagCompound data = new NBTTagCompound(); + data.setBoolean("toggle", true); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, funnel.xCoord, funnel.yCoord, funnel.zCoord)); + } + } @Override protected void drawGuiContainerForegroundLayer(int i, int j) { @@ -38,5 +60,7 @@ public class GUIFunnel extends GuiContainer { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + drawTexturedModalRect(guiLeft + 159, guiTop + 73, 176, funnel.mode * 10, 10, 10); } } diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 89362f753..df5d5a653 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 (4844)"; + public static final String VERSION = "1.0.27 BETA (4845)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/render/tileentity/RenderRadarScreen.java b/src/main/java/com/hbm/render/tileentity/RenderRadarScreen.java index 90130463e..5980da6a6 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderRadarScreen.java +++ b/src/main/java/com/hbm/render/tileentity/RenderRadarScreen.java @@ -7,7 +7,6 @@ import com.hbm.blocks.ModBlocks; import com.hbm.inventory.gui.GUIMachineRadarNT; import com.hbm.main.ResourceManager; import com.hbm.render.item.ItemRenderBase; -import com.hbm.tileentity.machine.TileEntityMachineRadarNT; import com.hbm.tileentity.machine.TileEntityMachineRadarScreen; import api.hbm.entity.RadarEntry; @@ -71,8 +70,8 @@ public class RenderRadarScreen extends TileEntitySpecialRenderer implements IIte for(RadarEntry entry : screen.entries) { - double sX = (entry.posX - screen.refX) / ((double) TileEntityMachineRadarNT.radarRange + 1) * (0.875D); - double sZ = (entry.posZ - screen.refZ) / ((double) TileEntityMachineRadarNT.radarRange + 1) * (0.875D); + double sX = (entry.posX - screen.refX) / ((double) screen.range + 1) * (0.875D); + double sZ = (entry.posZ - screen.refZ) / ((double) screen.range + 1) * (0.875D); double size = 0.0625D; tess.addVertexWithUV(0.38, 1 - sZ + size, 0.5 - sX + size, 216D / 256D, (entry.blipLevel * 8F + 8F) / 256F); tess.addVertexWithUV(0.38, 1 - sZ + size, 0.5 - sX - size, 224D / 256D, (entry.blipLevel * 8F + 8F) / 256F); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineFunnel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineFunnel.java index ee40ccf8f..3a1933554 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineFunnel.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineFunnel.java @@ -1,5 +1,6 @@ package com.hbm.tileentity.machine; +import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerFunnel; import com.hbm.inventory.gui.GUIFunnel; import com.hbm.tileentity.IGUIProvider; @@ -8,6 +9,7 @@ import com.hbm.tileentity.machine.TileEntityMachineAutocrafter.InventoryCrafting import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -15,9 +17,15 @@ import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.CraftingManager; import net.minecraft.item.crafting.IRecipe; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -public class TileEntityMachineFunnel extends TileEntityMachineBase implements IGUIProvider { +public class TileEntityMachineFunnel extends TileEntityMachineBase implements IGUIProvider, IControlReceiver { + + public int mode = 0; + public static final int MODE_ALL = 0; + public static final int MODE_3x3 = 1; + public static final int MODE_2x2 = 2; public TileEntityMachineFunnel() { super(18); @@ -37,9 +45,9 @@ public class TileEntityMachineFunnel extends TileEntityMachineBase implements IG if(slots[i] != null) { int stacksize = 9; - ItemStack compressed = slots[i].stackSize < 9 ? null : this.getFrom9(slots[i]); + ItemStack compressed = (mode == MODE_2x2 || slots[i].stackSize < 9) ? null : this.getFrom9(slots[i]); if(compressed == null) { - compressed = slots[i].stackSize < 4 ? null : this.getFrom4(slots[i]); + compressed = (mode == MODE_3x3 || slots[i].stackSize < 4) ? null : this.getFrom4(slots[i]); stacksize = 4; } @@ -54,8 +62,20 @@ public class TileEntityMachineFunnel extends TileEntityMachineBase implements IG } } } + + this.networkPackNT(15); } } + + @Override + public void serialize(ByteBuf buf) { + buf.writeInt(this.mode); + } + + @Override + public void deserialize(ByteBuf buf) { + this.mode = buf.readInt(); + } public int[] topAccess = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; public int[] bottomAccess = new int[] { 9, 10, 11, 12, 13, 14, 15, 16, 17 }; @@ -104,6 +124,18 @@ public class TileEntityMachineFunnel extends TileEntityMachineBase implements IG } return null; } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.mode = nbt.getInteger("mode"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("mode", mode); + } @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { @@ -115,4 +147,16 @@ public class TileEntityMachineFunnel extends TileEntityMachineBase implements IG public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIFunnel(player.inventory, this); } + + @Override + public boolean hasPermission(EntityPlayer player) { + return this.isUseableByPlayer(player); + } + + @Override + public void receiveControl(NBTTagCompound data) { + this.mode++; + if(mode > 2) mode = 0; + this.markDirty(); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarLarge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarLarge.java index 4fd6d497b..79b60e6b5 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarLarge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarLarge.java @@ -1,12 +1,34 @@ package com.hbm.tileentity.machine; +import java.io.IOException; + +import com.google.gson.JsonObject; +import com.google.gson.stream.JsonWriter; import com.hbm.lib.Library; +import com.hbm.tileentity.IConfigurableMachine; import com.hbm.util.fauxpointtwelve.DirPos; import net.minecraft.util.AxisAlignedBB; public class TileEntityMachineRadarLarge extends TileEntityMachineRadarNT { + public static int radarLargeRange = 3_000; + + @Override + public String getConfigName() { + return "radar_large"; + } + + @Override + public void readIfPresent(JsonObject obj) { + radarLargeRange = IConfigurableMachine.grab(obj, "I:radarLargeRange", radarLargeRange); + } + + @Override + public void writeConfig(JsonWriter writer) throws IOException { + writer.name("I:radarLargeRange").value(radarLargeRange); + } + @Override public int getRange() { return radarLargeRange; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java index ab8f13643..b29d37ea4 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java @@ -81,7 +81,6 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I public static int maxPower = 100_000; public static int consumption = 500; public static int radarRange = 1_000; - public static int radarLargeRange = 3_000; public static int radarBuffer = 30; public static int radarAltitude = 55; public static int chunkLoadCap = 10; @@ -102,7 +101,6 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I maxPower = IConfigurableMachine.grab(obj, "L:powerCap", maxPower); consumption = IConfigurableMachine.grab(obj, "L:consumption", consumption); radarRange = IConfigurableMachine.grab(obj, "I:radarRange", radarRange); - radarLargeRange = IConfigurableMachine.grab(obj, "I:radarLargeRange", radarLargeRange); radarBuffer = IConfigurableMachine.grab(obj, "I:radarBuffer", radarBuffer); radarAltitude = IConfigurableMachine.grab(obj, "I:radarAltitude", radarAltitude); chunkLoadCap = IConfigurableMachine.grab(obj, "I:chunkLoadCap", chunkLoadCap); @@ -114,7 +112,6 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I writer.name("L:powerCap").value(maxPower); writer.name("L:consumption").value(consumption); writer.name("I:radarRange").value(radarRange); - writer.name("I:radarLargeRange").value(radarLargeRange); writer.name("I:radarBuffer").value(radarBuffer); writer.name("I:radarAltitude").value(radarAltitude); writer.name("B:generateChunks").value(generateChunks); @@ -207,6 +204,7 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I screen.refX = xCoord; screen.refY = yCoord; screen.refZ = zCoord; + screen.range = this.getRange(); screen.linked = true; } } @@ -328,7 +326,7 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I if(this.power < consumption) return; this.power -= consumption; - int scan = this.scanRange(); + int scan = this.getRange(); RadarScanParams params = new RadarScanParams(this.scanMissiles, this.scanShells, this.scanPlayers, this.smartMode); @@ -394,10 +392,6 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I return 0; } - - protected int scanRange() { - return radarRange; - } @Override public void setPower(long i) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarScreen.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarScreen.java index 663b6835a..ba08f0d82 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarScreen.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarScreen.java @@ -21,6 +21,7 @@ public class TileEntityMachineRadarScreen extends TileEntity implements IBufPack public int refX; public int refY; public int refZ; + public int range; public boolean linked; @Override @@ -43,6 +44,7 @@ public class TileEntityMachineRadarScreen extends TileEntity implements IBufPack buf.writeInt(refX); buf.writeInt(refY); buf.writeInt(refZ); + buf.writeInt(range); buf.writeInt(entries.size()); for(RadarEntry entry : entries) entry.toBytes(buf); } @@ -53,6 +55,7 @@ public class TileEntityMachineRadarScreen extends TileEntity implements IBufPack refX = buf.readInt(); refY = buf.readInt(); refZ = buf.readInt(); + range = buf.readInt(); int count = buf.readInt(); this.entries.clear(); for(int i = 0; i < count; i++) { diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_funnel.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_funnel.png index 23f79d5049a806457297ce20f7eebfa8c03f68f8..2f4670d815c6ca5f19ed7351966cf3b21774c99b 100644 GIT binary patch literal 1486 zcmcIkdo0B5v!&32wH+7WNf+}k8Z~{ z+7ey6;GZR}A0DxK8g^(x!5U_~=C?i-U+-M=f3d%hf7L9_X1eN+J0EVB0g}fDA*r=FO zkQQRCjO2?G!XHlCzcZ6#`hJjOg5ejZ2p2gd$GR^&@tMZ+7)MJl%K&7oL>Dl2=GC|( zrklfkV)Zwz1;JcD&+MZ%Rf7{_BpF*oPRz~hO*I$^Rg}b?wy8>Kv8`mJu;TSuFCqBb^nG7x82^KhCg*bouLOYDQ6@ z)@M+&c#reQ|7W|+M6n*L?H!mOP}LiOVq-wuAV~(Alz}IucN6JggeKZmzJ_qiAjzhc zN~NHTy-4BhPN4wt`wiWiZddNr+~k}(Y(k$uCG^Ilh^St@;>T=0OVmvP}}7T zbY*IZX0H@UmFfzej^$woYH;>=D+alLVlKWuZ6)tMyViI%5>0k(rJKb zT|T$W_YZ`d?=o*)_-Wps1@RM=zsob$X)!h=FfkltVQAuHU=e2EP-77AVNjUC z;9vlk*n948+V#@a`3rJyOC7)1H}|OZ^wX(d`R>o=b+~$*d4t>i@1}i=Wv#o*YrIPB z^%zk#<1`f_VOA~YaC_U;?|)xOZ%l4a&RUfecJ$UIU6wd-lOjf|7s3gv#BV1Q}M~Z|1*Py?0d$XEpzVeYZiTFZ*=Yzc5aw|lOd$mh9Ub)ZTw@4TN^i59AEmfE`|vy*a-L>7|=Q2 zY#O%Zu73afs(I3JzT;1P9Q=;YY`9&>iN|Ni5tZ}p@qyUuYxgxO*WKSUxA<+0-t?>1 zHTh-?p`|O{cW$4&^KtU4-$a`RiS`XQKQr`wv;A0RRDQ!hIP|iKZ)j+}?4AcM3fAs7 zepV@6FyILdE!`Wp+U_6U<_W@$Z)EC@cRKw3D2FTcU=M~l94XH~Sib>kE#uq&*k!?A z3&9iT9+uDH*dqU)k)%L812*DtU79~jlX8*Lg)&4Wq}^vJ(b_Oq`Avb%)rb~1MuPTU#2rDZ#?T3t=|AL-qY33 JWt~$(69D_sk5d2u From 197b2837fb67ff3f7ba2e86ab221c65a347e8b7a Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 16 Jan 2024 07:42:34 +0100 Subject: [PATCH 22/30] =?UTF-8?q?CURSE=20OF=20RAH=20=F0=93=8E=A2?= =?UTF-8?q?=F0=93=85=B2=F0=93=82=8B=F0=93=8B=B4=F0=93=85=82=20=F0=93=85=B1?= =?UTF-8?q?=F0=93=86=91=20=F0=93=82=8B=F0=93=84=BF=F0=93=89=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/hbm/render/tileentity/RenderLaunchPadTier1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/render/tileentity/RenderLaunchPadTier1.java b/src/main/java/com/hbm/render/tileentity/RenderLaunchPadTier1.java index fe97935ec..a7e1a1c49 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderLaunchPadTier1.java +++ b/src/main/java/com/hbm/render/tileentity/RenderLaunchPadTier1.java @@ -34,7 +34,7 @@ public class RenderLaunchPadTier1 extends TileEntitySpecialRenderer { if(toRender != null) { GL11.glTranslated(0, 1, 0); Consumer renderer = ItemRenderMissileGeneric.renderers.get(new ComparableStack(toRender).makeSingular()); - renderer.accept(this.field_147501_a.field_147553_e); + if(renderer != null) renderer.accept(this.field_147501_a.field_147553_e); } } From 6865f59519ded1d3bac1db0bbca3827879fa4947 Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 16 Jan 2024 15:51:24 +0100 Subject: [PATCH 23/30] small foxes --- changelog | 28 ++----------------- .../hbm/entity/effect/EntityFalloutRain.java | 2 +- .../com/hbm/inventory/OreDictManager.java | 2 +- .../entity/rocket/RenderMissileNuclear.java | 1 + 4 files changed, 6 insertions(+), 27 deletions(-) diff --git a/changelog b/changelog index 4ed8554c2..0743f38db 100644 --- a/changelog +++ b/changelog @@ -1,27 +1,5 @@ -## Added -* Pipettes - * Precision tools for carrying small amounts of liquids - * Come in three variants, normal, boron (corrosion-resistant) and laboratory (smaller capacity, more precision) - * Unlike most fluid containers, can be partially filled - * Capacity can be changed by right-clicking if the pipette is empty - -## Changed -* Updated russian localization -* There is now a config option to disable the biome change caused by fallout. The config will also determine whether the biomes are registered at all, which prevents them from conflicting with other mods' biomes when disabled. -* Chemical plants now have a timer that starts after loading/unloading fluids using item fluid containers from the input buffers, this creates a delay between switching from loading and unloading, making it possible to retrieve fluids using pipettes. -* In addition to delaying overheats, efficiency upgrades now reduce the cyclotron's coolant demand -* Removed the tooltips from common upgrades, as the info was incomplete and outdated anyway -* Meteorite swords now render their variant glint in first person view -* Meteorite swords are now a lot larger, similar to most other NTM swords -* Non-custom missile items now render in 3D -* Combinator funnels can now be configured whether to only do 3x3, 2x2 or both recipe types ## Fixed -* Fixed trenchmaster armor not doing most of the armor calculation, making it the worst armor -* Fixed glowing mushrooms not being able to be bonemealed -* Fixed strand caster having one port that does not work with certain rotations -* Fixed fallout being able to replace bedrock -* Fixed the upgrade info of the large mining drill being incorrect -* Fixed cyclotron not having the new upgrade info tooltip -* Fixed the large radar not actually having a larger scan range -* Fixed radar blips going out of bounds when using a radar screen with a large radar or a radar with a different config +* Fixed sellafite emerald ore being oredicted as emerald dust +* Fixed fire replacing petrified wood, creating tons of dead trees with holes in them +* Fixed inconsistent scaling with nuclear missiles diff --git a/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java b/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java index 2f59a0408..70ebac3dc 100644 --- a/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java +++ b/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java @@ -178,7 +178,7 @@ public class EntityFalloutRain extends Entity { } if(dist < 65 && b.isFlammable(worldObj, x, y, z, ForgeDirection.UP)) { - if(rand.nextInt(5) == 0) + if(rand.nextInt(5) == 0 && worldObj.getBlock(x, y + 1, z).isAir(worldObj, x, y + 1, z)) setBlock(x, y + 1, z, Blocks.fire); } diff --git a/src/main/java/com/hbm/inventory/OreDictManager.java b/src/main/java/com/hbm/inventory/OreDictManager.java index a5ffef0e6..4995290e8 100644 --- a/src/main/java/com/hbm/inventory/OreDictManager.java +++ b/src/main/java/com/hbm/inventory/OreDictManager.java @@ -315,7 +315,7 @@ public class OreDictManager { LAPIS.dust(powder_lapis); NETHERQUARTZ.gem(Items.quartz).dust(powder_quartz).ore(Blocks.quartz_ore); DIAMOND.dust(powder_diamond).ore(gravel_diamond, ore_sellafield_diamond); - EMERALD.dust(powder_emerald, ore_sellafield_emerald); + EMERALD.dust(powder_emerald).ore(ore_sellafield_emerald); /* * RADIOACTIVE diff --git a/src/main/java/com/hbm/render/entity/rocket/RenderMissileNuclear.java b/src/main/java/com/hbm/render/entity/rocket/RenderMissileNuclear.java index f69443b8f..9282833db 100644 --- a/src/main/java/com/hbm/render/entity/rocket/RenderMissileNuclear.java +++ b/src/main/java/com/hbm/render/entity/rocket/RenderMissileNuclear.java @@ -18,6 +18,7 @@ public class RenderMissileNuclear extends Render { GL11.glPushMatrix(); GL11.glTranslatef((float) p_76986_2_, (float) p_76986_4_, (float) p_76986_6_); + GL11.glScalef(1.5F, 1.5F, 1.5F); GL11.glRotatef(missile.prevRotationYaw + (missile.rotationYaw - missile.prevRotationYaw) * p_76986_9_ - 90.0F, 0.0F, 1.0F, 0.0F); GL11.glRotatef(missile.prevRotationPitch + (missile.rotationPitch - missile.prevRotationPitch) * p_76986_9_, 0.0F, 0.0F, 1.0F); From 2d80856d5f7eec4e900ac230bccc60e2c1445f29 Mon Sep 17 00:00:00 2001 From: Bob Date: Wed, 17 Jan 2024 18:51:54 +0100 Subject: [PATCH 24/30] more foxes, somehow --- changelog | 3 +++ .../java/com/hbm/entity/effect/EntityFalloutRain.java | 2 +- .../java/com/hbm/inventory/fluid/tank/FluidTank.java | 6 +++++- src/main/java/com/hbm/items/ModItems.java | 10 ++++++++-- .../machine/TileEntityFoundryCastingBase.java | 1 - .../tileentity/machine/TileEntityMachineChemplant.java | 4 ++-- src/main/resources/assets/hbm/lang/en_US.lang | 8 ++++---- 7 files changed, 23 insertions(+), 11 deletions(-) diff --git a/changelog b/changelog index 0743f38db..22dc7d698 100644 --- a/changelog +++ b/changelog @@ -3,3 +3,6 @@ * Fixed sellafite emerald ore being oredicted as emerald dust * Fixed fire replacing petrified wood, creating tons of dead trees with holes in them * Fixed inconsistent scaling with nuclear missiles +* Fixed BFB rods being called ZFB in hot and depleted variants +* Fixed infinite water barrels voiding water completely after the chemplant's input buffer runs full, infinite barrels can no longer void water in chemplants +* Fixed fallout affecting things on Y:0 like bedrock ores and oil diff --git a/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java b/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java index 70ebac3dc..40bae46eb 100644 --- a/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java +++ b/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java @@ -155,7 +155,7 @@ public class EntityFalloutRain extends Entity { int depth = 0; - for(int y = 255; y >= 0; y--) { + for(int y = 255; y >= 1; y--) { if(depth >= 3) return; diff --git a/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java b/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java index 4294759bb..508f94c01 100644 --- a/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java +++ b/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java @@ -1,7 +1,9 @@ package com.hbm.inventory.fluid.tank; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.lwjgl.opengl.GL11; @@ -15,6 +17,7 @@ import com.hbm.packet.TEFluidPacket; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -22,8 +25,9 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.MathHelper; public class FluidTank { - + public static final List loadingHandlers = new ArrayList(); + public static final Set noDualUnload = new HashSet(); static { loadingHandlers.add(new FluidLoaderStandard()); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 8141f5483..af65ba54f 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -9,6 +9,7 @@ import com.hbm.handler.WeaponAbility; import com.hbm.handler.guncfg.*; import com.hbm.interfaces.ICustomWarhead.SaltedFuel.HalfLifeType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.material.MaterialShapes; import com.hbm.inventory.material.Mats; import com.hbm.items.ItemAmmoEnums.*; @@ -3008,6 +3009,7 @@ public class ModItems { component_limiter = new Item().setUnlocalizedName("component_limiter").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":component_limiter"); component_emitter = new Item().setUnlocalizedName("component_emitter").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":component_emitter"); chlorine_pinwheel = new ItemInfiniteFluid(Fluids.CHLORINE, 1, 2).setUnlocalizedName("chlorine_pinwheel").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chlorine_pinwheel"); + FluidTank.noDualUnload.add(chlorine_pinwheel); ring_starmetal = new Item().setUnlocalizedName("ring_starmetal").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ring_starmetal"); flywheel_beryllium = new Item().setUnlocalizedName("flywheel_beryllium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":flywheel_beryllium"); deuterium_filter = new Item().setUnlocalizedName("deuterium_filter").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":deuterium_filter"); @@ -3238,8 +3240,6 @@ public class ModItems { singularity_spark = new ItemDrop().setUnlocalizedName("singularity_spark").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.nuclear_waste).setTextureName(RefStrings.MODID + ":singularity_spark_alt"); pellet_antimatter = new ItemDrop().setUnlocalizedName("pellet_antimatter").setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.cell_empty).setTextureName(RefStrings.MODID + ":pellet_antimatter"); crystal_xen = new ItemDrop().setUnlocalizedName("crystal_xen").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":crystal_xen"); - inf_water = new ItemInfiniteFluid(Fluids.WATER, 50).setUnlocalizedName("inf_water").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":inf_water"); - inf_water_mk2 = new ItemInfiniteFluid(Fluids.WATER, 500).setUnlocalizedName("inf_water_mk2").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":inf_water_mk2"); stamp_stone_flat = new ItemStamp(10, StampType.FLAT).setUnlocalizedName("stamp_stone_flat").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":stamp_stone_flat"); stamp_stone_plate = new ItemStamp(10, StampType.PLATE).setUnlocalizedName("stamp_stone_plate").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":stamp_stone_plate"); @@ -4658,7 +4658,13 @@ public class ModItems { pipette = new ItemPipette().setUnlocalizedName("pipette").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pipette"); pipette_boron = new ItemPipette().setUnlocalizedName("pipette_boron").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pipette_boron"); pipette_laboratory = new ItemPipette().setUnlocalizedName("pipette_laboratory").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pipette_laboratory"); + inf_water = new ItemInfiniteFluid(Fluids.WATER, 50).setUnlocalizedName("inf_water").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":inf_water"); + inf_water_mk2 = new ItemInfiniteFluid(Fluids.WATER, 500).setUnlocalizedName("inf_water_mk2").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":inf_water_mk2"); + FluidTank.noDualUnload.add(fluid_barrel_infinite); + FluidTank.noDualUnload.add(inf_water); + FluidTank.noDualUnload.add(inf_water_mk2); + disperser_canister_empty = new Item().setUnlocalizedName("disperser_canister_empty").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":disperser_canister"); disperser_canister = new ItemDisperser().setUnlocalizedName("disperser_canister").setContainerItem(ModItems.disperser_canister_empty).setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":disperser_canister"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java index da2a8d8a5..a4645bade 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java @@ -7,7 +7,6 @@ import com.hbm.items.machine.ItemMold.Mold; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java index 110e79c9a..1c7fe4c47 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java @@ -109,8 +109,8 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements if(lsu0 >= fluidDelay && tanks[0].loadTank(17, 19, slots)) lsl0 = 0; if(lsu1 >= fluidDelay && tanks[1].loadTank(18, 20, slots)) lsl1 = 0; - if(lsl0 >= fluidDelay && slots[17] != null && slots[17].getItem() != ModItems.fluid_barrel_infinite) if(tanks[0].unloadTank(17, 19, slots)) lsu0 = 0; - if(lsl1 >= fluidDelay && slots[18] != null && slots[18].getItem() != ModItems.fluid_barrel_infinite) if(tanks[1].unloadTank(18, 20, slots)) lsu1 = 0; + if(lsl0 >= fluidDelay && slots[17] != null && !FluidTank.noDualUnload.contains(slots[17].getItem())) if(tanks[0].unloadTank(17, 19, slots)) lsu0 = 0; + if(lsl1 >= fluidDelay && slots[18] != null && !FluidTank.noDualUnload.contains(slots[18].getItem())) if(tanks[1].unloadTank(18, 20, slots)) lsu1 = 0; tanks[2].unloadTank(9, 11, slots); tanks[3].unloadTank(10, 12, slots); diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 1ab2a42b8..2d45971c6 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3676,8 +3676,8 @@ item.pwr_fuel.men.name=MEN PWR Fuel Rod item.pwr_fuel.mep.name=MEP PWR Fuel Rod item.pwr_fuel.meu.name=MEU PWR Fuel Rod item.pwr_fuel.mox.name=MOX PWR Fuel Rod -item.pwr_fuel_depleted.bfb_am_mix.name=Depleted Fuel Grade Americium PWR ZFB Rod -item.pwr_fuel_depleted.bfb_pu241.name=Depleted Plutonium-241 PWR ZFB Rod +item.pwr_fuel_depleted.bfb_am_mix.name=Depleted Fuel Grade Americium PWR BFB Rod +item.pwr_fuel_depleted.bfb_pu241.name=Depleted Plutonium-241 PWR BFB Rod item.pwr_fuel_depleted.hea242.name=Depleted HEA-242 PWR Fuel Rod item.pwr_fuel_depleted.hen237.name=Depleted HEN-237 PWR Fuel Rod item.pwr_fuel_depleted.hep239.name=Depleted HEP-239 PWR Fuel Rod @@ -3691,8 +3691,8 @@ item.pwr_fuel_depleted.men.name=Depleted MEN PWR Fuel Rod item.pwr_fuel_depleted.mep.name=Depleted MEP PWR Fuel Rod item.pwr_fuel_depleted.meu.name=Depleted MEU PWR Fuel Rod item.pwr_fuel_depleted.mox.name=Depleted MOX PWR Fuel Rod -item.pwr_fuel_hot.bfb_am_mix.name=Hot Fuel Grade Americium PWR ZFB Rod -item.pwr_fuel_hot.bfb_pu241.name=Hot Plutonium-241 PWR ZFB Rod +item.pwr_fuel_hot.bfb_am_mix.name=Hot Fuel Grade Americium PWR BFB Rod +item.pwr_fuel_hot.bfb_pu241.name=Hot Plutonium-241 PWR BFB Rod item.pwr_fuel_hot.hea242.name=Hot HEA-242 PWR Fuel Rod item.pwr_fuel_hot.hen237.name=Hot HEN-237 PWR Fuel Rod item.pwr_fuel_hot.hep239.name=Hot HEP-239 PWR Fuel Rod From aa6d0708cd9e5e1476f74baa1ca82d8271a7a7c7 Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 18 Jan 2024 21:37:22 +0100 Subject: [PATCH 25/30] silo hatch --- src/main/java/com/hbm/blocks/ModBlocks.java | 3 + .../hbm/blocks/generic/BlockDoorGeneric.java | 13 +- .../java/com/hbm/main/ResourceManager.java | 3 + .../java/com/hbm/tileentity/DoorDecl.java | 63 ++++ .../assets/hbm/models/doors/silo_hatch.obj | 344 ++++++++++++++++++ .../hbm/textures/models/doors/silo_hatch.png | Bin 0 -> 851 bytes 6 files changed, 423 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/assets/hbm/models/doors/silo_hatch.obj create mode 100644 src/main/resources/assets/hbm/textures/models/doors/silo_hatch.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 923ba0029..31d8488d5 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -602,6 +602,7 @@ public class ModBlocks { public static Block sliding_blast_door; public static Block fire_door; public static Block transition_seal; + public static Block silo_hatch; // 1.12.2 Doors public static Block secure_access_door; @@ -2115,6 +2116,7 @@ public class ModBlocks { sliding_blast_door = new BlockDoorGeneric(Material.iron, DoorDecl.SLIDE_DOOR).setBlockName("sliding_blast_door").setHardness(10.0F).setResistance(750.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":sliding_blast_door"); fire_door = new BlockDoorGeneric(Material.iron, DoorDecl.FIRE_DOOR).setBlockName("fire_door").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":fire_door"); transition_seal = new BlockDoorGeneric(Material.iron, DoorDecl.TRANSITION_SEAL).setBlockName("transition_seal").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":transition_seal"); + silo_hatch = new BlockDoorGeneric(Material.iron, DoorDecl.SILO_HATCH).setBlockName("silo_hatch").setHardness(10.0F).setResistance(100.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); secure_access_door = new BlockDoorGeneric(Material.iron, DoorDecl.SECURE_ACCESS_DOOR).setBlockName("secure_access_door").setHardness(20.0F).setResistance(2_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); large_vehicle_door = new BlockDoorGeneric(Material.iron, DoorDecl.LARGE_VEHICLE_DOOR).setBlockName("large_vehicle_door").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); qe_containment = new BlockDoorGeneric(Material.iron, DoorDecl.QE_CONTAINMENT).setBlockName("qe_containment").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); @@ -3052,6 +3054,7 @@ public class ModBlocks { GameRegistry.registerBlock(blast_door, blast_door.getUnlocalizedName()); GameRegistry.registerBlock(fire_door, fire_door.getUnlocalizedName()); GameRegistry.registerBlock(transition_seal, transition_seal.getUnlocalizedName()); + GameRegistry.registerBlock(silo_hatch, silo_hatch.getUnlocalizedName()); GameRegistry.registerBlock(sliding_blast_door, sliding_blast_door.getUnlocalizedName()); //Doors diff --git a/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java b/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java index 5d44d76f0..841d834f9 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java +++ b/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java @@ -43,7 +43,7 @@ public class BlockDoorGeneric extends BlockDummyable { @Override public int getOffset(){ - return 0; + return type.getBlockOffset(); } @Override @@ -80,8 +80,8 @@ public class BlockDoorGeneric extends BlockDummyable { Math.min(box.minX, box.maxX), Math.min(box.minY, box.maxY), Math.min(box.minZ, box.maxZ), Math.max(box.minX, box.maxX), Math.max(box.minY, box.maxY), Math.max(box.minZ, box.maxZ)); - if(box.minY == y && box.maxY == y) - return; + if(box.minY == y && box.maxY == y) return; + if(box.minX == box.maxX && box.minY == box.maxY && box.minZ == box.maxZ) return; if(box != null && box.intersectsWith(entityBox)) { collidingBoxes.add(box); @@ -91,6 +91,13 @@ public class BlockDoorGeneric extends BlockDummyable { // return; //super.addCollisionBoxesToList(worldIn, x, y, z, entityBox, collidingBoxes, entityIn); } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + AxisAlignedBB aabb = this.getBoundingBox(world, x, y, z); + if(aabb.minX == aabb.maxX && aabb.minY == aabb.maxY && aabb.minZ == aabb.maxZ) return null; + return aabb; + } @Override //should fix AI pathfinding public boolean getBlocksMovement(IBlockAccess world, int x, int y, int z) { //btw the method name is the exact opposite of that it's doing, check net.minecraft.pathfinding.PathNavigate#512 diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 0eeb22d63..599ccb1d2 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -349,6 +349,9 @@ public class ResourceManager { public static WavefrontObjDisplayList large_vehicle_door = new WavefrontObjDisplayList(new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/doors/large_vehicle_door.obj"))); public static final ResourceLocation qe_containment_decal = new ResourceLocation(RefStrings.MODID, "textures/models/doors/qe_containment_decal.png"); + public static final ResourceLocation silo_hatch_tex = new ResourceLocation(RefStrings.MODID, "textures/models/doors/silo_hatch.png"); + public static WavefrontObjDisplayList silo_hatch = new WavefrontObjDisplayList(new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/doors/silo_hatch.obj"))); + //Lantern public static final IModelCustom lantern = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/trinkets/lantern.obj")); diff --git a/src/main/java/com/hbm/tileentity/DoorDecl.java b/src/main/java/com/hbm/tileentity/DoorDecl.java index 5f81ef8f5..c0fcadc02 100644 --- a/src/main/java/com/hbm/tileentity/DoorDecl.java +++ b/src/main/java/com/hbm/tileentity/DoorDecl.java @@ -862,6 +862,65 @@ public abstract class DoorDecl { }; + public static final DoorDecl SILO_HATCH = new DoorDecl() { + + @Override public String getOpenSoundEnd() { return "hbm:door.wgh_big_stop"; }; + @Override public String getOpenSoundLoop() { return "hbm:door.wgh_big_start"; }; + @Override public String getOpenSoundStart() { return null; }; + @Override public String getCloseSoundStart() { return null; }; + @Override public String getCloseSoundEnd() { return "hbm:door.wgh_big_stop"; }; + @Override public float getSoundVolume() { return 2; } + + @Override + @SideOnly(Side.CLIENT) + public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { + if("Hatch".equals(partName)) { + set(trans, 0, 0.25F * Library.smoothstep(getNormTime(openTicks, 0, 10), 0, 1), 0); + } else { + set(trans, 0, 0, 0); + } + }; + + @Override + @SideOnly(Side.CLIENT) + public void getOrigin(String partName, float[] orig) { + if("Hatch".equals(partName)) { + set(orig, 0F, 0.875F, -1.875F); + return; + } + set(orig, 0, 0, 0); + super.getOrigin(partName, orig); + }; + + @Override + @SideOnly(Side.CLIENT) + public void getRotation(String partName, float openTicks, float[] rot) { + if("Hatch".equals(partName)) { + set(rot, Library.smoothstep(getNormTime(openTicks, 20, 100), 0, 1) * -240, 0, 0); + return; + } + super.getRotation(partName, openTicks, rot); + }; + + @Override + @SideOnly(Side.CLIENT) + public boolean doesRender(String partName, boolean child) { + return true; + }; + + @Override public int timeToOpen() { return 60; }; + @Override public int[][] getDoorOpenRanges() { return new int[][] { { 1, 0, 1, -3, 3, 0 }, { 0, 0, 1, -3, 3, 0 }, { -1, 0, 1, -3, 3, 0 } }; } + @Override public float getDoorRangeOpenTime(int ticks, int idx) { return getNormTime(ticks, 20, 20); }; + + + @Override public int getBlockOffset() { return 2; } + @Override public int[] getDimensions() { return new int[] { 0, 0, 2, 2, 2, 2 }; } + @Override @SideOnly(Side.CLIENT) public ResourceLocation getTextureForPart(String partName) { return ResourceManager.silo_hatch_tex; } + @Override public ResourceLocation getTextureForPart(int skinIndex, String partName) { return ResourceManager.silo_hatch_tex; } + @Override @SideOnly(Side.CLIENT) public WavefrontObjDisplayList getModel() { return ResourceManager.silo_hatch; } + + }; + public static final DoorDecl LARGE_VEHICLE_DOOR = new DoorDecl() { @Override @@ -948,6 +1007,10 @@ public abstract class DoorDecl { public abstract int[][] getDoorOpenRanges(); public abstract int[] getDimensions(); + + public int getBlockOffset() { + return 0; + } public float getDoorRangeOpenTime(int ticks, int idx) { return getNormTime(ticks); diff --git a/src/main/resources/assets/hbm/models/doors/silo_hatch.obj b/src/main/resources/assets/hbm/models/doors/silo_hatch.obj new file mode 100644 index 000000000..e500f7adf --- /dev/null +++ b/src/main/resources/assets/hbm/models/doors/silo_hatch.obj @@ -0,0 +1,344 @@ +# Blender v2.79 (sub 0) OBJ File: 'silo_hatch.blend' +# www.blender.org +o Hatch +v -1.750000 0.750000 1.750000 +v 1.750000 0.750000 1.750000 +v -1.750000 0.750000 -1.750000 +v 1.750000 0.750000 -1.750000 +v -1.750000 1.000000 -1.750000 +v -1.750000 1.000000 1.750000 +v 1.750000 1.000000 1.750000 +v 1.750000 1.000000 -1.750000 +v -1.500000 0.750000 -1.500000 +v -1.500000 0.750000 1.500000 +v 1.500000 0.750000 1.500000 +v 1.500000 0.750000 -1.500000 +v -1.500000 0.500000 -1.500000 +v -1.500000 0.500000 1.500000 +v 1.500000 0.500000 1.500000 +v 1.500000 0.500000 -1.500000 +v -1.000000 0.750000 -1.500000 +v 1.000000 0.750000 -1.500000 +v -1.000000 0.750000 -2.000000 +v 1.000000 0.750000 -2.000000 +v -1.000000 0.500000 -2.000000 +v -1.000000 0.500000 -1.500000 +v 1.000000 0.500000 -1.500000 +v 1.000000 0.500000 -2.000000 +vt 0.588235 0.333333 +vt 0.970588 0.309524 +vt 1.000000 0.333333 +vt 1.000000 0.357143 +vt 0.588235 0.690476 +vt 0.588235 0.357143 +vt 1.000000 0.333333 +vt 0.588235 0.357143 +vt 0.588235 0.333333 +vt 1.000000 0.333333 +vt 0.588235 0.357143 +vt 0.588235 0.333333 +vt 1.000000 0.333333 +vt 0.588235 0.357143 +vt 0.588235 0.333333 +vt 0.970588 0.309524 +vt 0.970588 0.309524 +vt 0.970588 0.309524 +vt 0.617647 0.309524 +vt 0.970588 0.285714 +vt 0.617647 0.309524 +vt 0.970588 0.285714 +vt 0.617647 0.309524 +vt 0.970588 0.285714 +vt 0.617647 0.309524 +vt 0.970588 0.285714 +vt 0.970588 0.000000 +vt 0.617647 0.285714 +vt 0.617647 -0.000000 +vt 0.852941 0.809524 +vt 0.617647 0.761905 +vt 0.852941 0.761905 +vt 0.617647 0.738095 +vt 0.852941 0.690476 +vt 0.852941 0.738095 +vt 0.558824 0.761905 +vt 0.911765 0.738095 +vt 0.911765 0.761905 +vt 1.000000 0.690476 +vt 1.000000 0.357143 +vt 1.000000 0.357143 +vt 1.000000 0.357143 +vt 0.617647 0.285714 +vt 0.617647 0.285714 +vt 0.617647 0.285714 +vt 0.617647 0.809524 +vt 0.617647 0.690476 +vt 0.558824 0.738095 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +s off +f 1/1/1 11/2/1 2/3/1 +f 7/4/2 5/5/2 6/6/2 +f 3/7/3 8/8/3 4/9/3 +f 2/3/4 6/6/4 1/1/4 +f 4/10/5 7/11/5 2/12/5 +f 1/13/6 5/14/6 3/15/6 +f 2/12/1 12/16/1 4/10/1 +f 4/9/1 9/17/1 3/7/1 +f 3/15/1 10/18/1 1/13/1 +f 11/19/5 16/20/5 12/16/5 +f 9/21/6 14/22/6 10/18/6 +f 12/23/3 13/24/3 9/17/3 +f 10/25/4 15/26/4 11/2/4 +f 16/27/1 14/28/1 13/29/1 +f 17/30/2 20/31/2 19/32/2 +f 24/33/1 22/34/1 21/35/1 +f 18/36/5 24/33/5 20/31/5 +f 20/31/3 21/35/3 19/32/3 +f 19/32/6 22/37/6 17/38/6 +f 1/1/1 10/25/1 11/2/1 +f 7/4/2 8/39/2 5/5/2 +f 3/7/3 5/40/3 8/8/3 +f 2/3/4 7/4/4 6/6/4 +f 4/10/5 8/41/5 7/11/5 +f 1/13/6 6/42/6 5/14/6 +f 2/12/1 11/19/1 12/16/1 +f 4/9/1 12/23/1 9/17/1 +f 3/15/1 9/21/1 10/18/1 +f 11/19/5 15/43/5 16/20/5 +f 9/21/6 13/44/6 14/22/6 +f 12/23/3 16/45/3 13/24/3 +f 10/25/4 14/28/4 15/26/4 +f 16/27/1 15/26/1 14/28/1 +f 17/30/2 18/46/2 20/31/2 +f 24/33/1 23/47/1 22/34/1 +f 18/36/5 23/48/5 24/33/5 +f 20/31/3 24/33/3 21/35/3 +f 19/32/6 21/35/6 22/37/6 +o Frame +v -2.500000 0.000000 2.500000 +v 2.500000 0.000000 2.500000 +v -2.500000 0.000000 -2.500000 +v 2.500000 0.000000 -2.500000 +v -2.500000 0.250000 2.500000 +v 2.500000 0.250000 2.500000 +v -2.500000 0.250000 -2.500000 +v 2.500000 0.250000 -2.500000 +v -2.250000 1.000000 2.250000 +v 2.250000 1.000000 2.250000 +v -2.250000 1.000000 -2.250000 +v 2.250000 1.000000 -2.250000 +v -1.500000 0.000000 1.500000 +v 1.500000 0.000000 1.500000 +v -1.500000 0.000000 -1.500000 +v 1.500000 0.000000 -1.500000 +v -1.500000 0.750000 -1.500000 +v -1.500000 0.750000 1.500000 +v 1.500000 0.750000 1.500000 +v 1.500000 0.750000 -1.500000 +v -1.750000 0.750000 1.750000 +v 1.750000 0.750000 1.750000 +v -1.750000 0.750000 -1.750000 +v 1.750000 0.750000 -1.750000 +v -1.750000 1.000000 1.750000 +v 1.750000 1.000000 1.750000 +v -1.750000 1.000000 -1.750000 +v 1.750000 1.000000 -1.750000 +v -1.000000 0.750000 -1.750000 +v 1.000000 0.750000 -1.750000 +v 1.000000 0.500000 -1.500000 +v -1.000000 0.500000 -1.500000 +v -1.000000 1.000000 -1.750000 +v 1.000000 1.000000 -1.750000 +v -1.000000 1.000000 -2.000000 +v 1.000000 1.000000 -2.000000 +v -1.000000 0.500000 -2.000000 +v 1.000000 0.500000 -2.000000 +v -1.000000 0.750000 -1.500000 +v 1.000000 0.750000 -1.500000 +vt 0.117647 0.761905 +vt 0.470588 0.761905 +vt 0.176471 0.809524 +vt 0.588235 0.500000 +vt 0.029412 0.571429 +vt -0.000000 0.500000 +vt 0.588235 0.476190 +vt 0.000000 0.500000 +vt 0.000000 0.476190 +vt 0.588235 0.476190 +vt -0.000000 0.476190 +vt 0.588235 0.476190 +vt -0.000000 0.500000 +vt -0.000000 0.476190 +vt 0.588235 0.476190 +vt -0.000000 0.500000 +vt -0.000000 0.476190 +vt 0.470588 0.380952 +vt 0.588235 0.500000 +vt 0.029412 0.571429 +vt 0.588235 0.500000 +vt 0.029412 0.571429 +vt 0.588235 0.500000 +vt 0.029412 0.571429 +vt 0.000000 0.000000 +vt 0.117647 0.380952 +vt 0.470588 0.833333 +vt 0.117647 0.761905 +vt 0.470588 0.761905 +vt 0.470588 0.833333 +vt 0.117647 0.761905 +vt 0.470588 0.761905 +vt 0.470588 0.833333 +vt 0.117647 0.761905 +vt 0.470588 0.761905 +vt 0.470588 0.095238 +vt 0.588235 0.000000 +vt 0.117647 0.095238 +vt 0.088235 0.857143 +vt 0.117647 0.833333 +vt 0.088235 0.857143 +vt 0.117647 0.833333 +vt 0.176471 0.857143 +vt 0.117647 0.833333 +vt 0.176471 0.833333 +vt 0.088235 0.857143 +vt 0.117647 0.833333 +vt 0.500000 0.857143 +vt 0.088235 0.880952 +vt 0.500000 0.857143 +vt 0.088235 0.880952 +vt 0.500000 0.857143 +vt 0.088235 0.880952 +vt 0.500000 0.619048 +vt 0.558824 0.571429 +vt 0.500000 0.952381 +vt 0.558824 1.000000 +vt 0.176471 0.928571 +vt 0.411765 0.976190 +vt 0.176471 0.976190 +vt 0.088235 0.619048 +vt 0.029412 1.000000 +vt 0.176471 0.880952 +vt 0.411765 0.928571 +vt 0.117647 0.928571 +vt 0.117647 0.904762 +vt 0.147059 0.904762 +vt 0.176471 0.880952 +vt 0.088235 0.857143 +vt 0.500000 0.857143 +vt 0.411765 0.880952 +vt 0.411765 0.857143 +vt 0.470588 0.833333 +vt 0.411765 0.833333 +vt 0.441176 0.904762 +vt 0.470588 0.928571 +vt 0.411765 0.809524 +vt 0.558824 0.571429 +vt 0.558824 0.571429 +vt 0.558824 0.571429 +vt 0.500000 0.880952 +vt 0.500000 0.880952 +vt 0.500000 0.880952 +vt 0.088235 0.952381 +vt 0.411765 0.880952 +vt 0.147059 0.880952 +vt 0.088235 0.880952 +vt 0.500000 0.880952 +vt 0.176471 0.952381 +vt 0.411765 0.952381 +vt 0.441176 0.880952 +vt 0.470588 0.904762 +vn 0.0000 0.0000 1.0000 +vn 0.9487 0.3162 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -1.0000 0.0000 +vn -0.9487 0.3162 0.0000 +vn 0.0000 0.3162 -0.9487 +vn 0.0000 0.3162 0.9487 +vn 0.0000 1.0000 0.0000 +s off +f 39/49/7 40/50/7 56/51/7 +f 32/52/8 34/53/8 30/54/8 +f 26/55/7 29/56/7 25/57/7 +f 28/58/9 30/54/9 26/59/9 +f 25/60/10 31/61/10 27/62/10 +f 27/63/11 32/64/11 28/65/11 +f 25/57/12 38/66/12 26/55/12 +f 29/67/13 35/68/13 31/61/13 +f 31/69/14 36/70/14 32/64/14 +f 30/71/15 33/72/15 29/56/15 +f 27/73/12 37/74/12 25/57/12 +f 42/75/11 38/76/11 37/77/11 +f 43/78/10 40/79/10 38/80/10 +f 41/81/9 37/82/9 39/83/9 +f 26/55/12 40/84/12 28/85/12 +f 28/85/12 39/86/12 27/73/12 +f 42/75/16 46/87/16 43/88/16 +f 43/78/16 48/89/16 44/90/16 +f 53/91/16 41/92/16 63/93/16 +f 41/81/16 45/94/16 42/95/16 +f 45/96/11 50/97/11 46/87/11 +f 46/98/10 52/99/10 48/89/10 +f 47/100/9 49/101/9 45/94/9 +f 50/102/16 33/72/16 34/103/16 +f 52/104/16 34/103/16 36/105/16 +f 61/106/7 60/107/7 59/108/7 +f 49/109/16 35/110/16 33/72/16 +f 56/111/16 62/112/16 61/106/16 +f 59/113/9 57/114/9 53/115/9 +f 57/116/7 47/117/7 53/91/7 +f 48/118/7 58/119/7 54/120/7 +f 35/110/16 60/107/16 36/105/16 +f 44/121/16 54/120/16 64/122/16 +f 54/123/10 60/124/10 62/112/10 +f 63/93/7 41/92/7 56/51/7 +f 41/92/7 39/49/7 56/51/7 +f 40/50/7 44/121/7 55/125/7 +f 44/121/7 64/122/7 55/125/7 +f 40/50/7 55/125/7 56/51/7 +f 32/52/8 36/126/8 34/53/8 +f 26/55/7 30/71/7 29/56/7 +f 28/58/9 32/52/9 30/54/9 +f 25/60/10 29/67/10 31/61/10 +f 27/63/11 31/69/11 32/64/11 +f 25/57/12 37/74/12 38/66/12 +f 29/67/13 33/127/13 35/68/13 +f 31/69/14 35/128/14 36/70/14 +f 30/71/15 34/103/15 33/72/15 +f 27/73/12 39/86/12 37/74/12 +f 42/75/11 43/88/11 38/76/11 +f 43/78/10 44/90/10 40/79/10 +f 41/81/9 42/95/9 37/82/9 +f 26/55/12 38/66/12 40/84/12 +f 28/85/12 40/84/12 39/86/12 +f 42/75/16 45/96/16 46/87/16 +f 43/78/16 46/98/16 48/89/16 +f 53/91/16 47/117/16 41/92/16 +f 41/81/16 47/100/16 45/94/16 +f 45/96/11 49/129/11 50/97/11 +f 46/98/10 50/130/10 52/99/10 +f 47/100/9 51/131/9 49/101/9 +f 50/102/16 49/109/16 33/72/16 +f 52/104/16 50/102/16 34/103/16 +f 61/106/7 62/112/7 60/107/7 +f 49/109/16 51/132/16 35/110/16 +f 56/111/16 55/133/16 62/112/16 +f 63/134/9 56/111/9 53/115/9 +f 56/111/9 61/106/9 53/115/9 +f 61/106/9 59/113/9 53/115/9 +f 57/116/7 51/135/7 47/117/7 +f 48/118/7 52/136/7 58/119/7 +f 35/110/16 51/132/16 59/108/16 +f 51/132/16 57/137/16 59/108/16 +f 58/138/16 52/104/16 60/107/16 +f 52/104/16 36/105/16 60/107/16 +f 35/110/16 59/108/16 60/107/16 +f 44/121/16 48/118/16 54/120/16 +f 55/133/10 64/139/10 54/123/10 +f 54/123/10 58/140/10 60/124/10 +f 62/112/10 55/133/10 54/123/10 diff --git a/src/main/resources/assets/hbm/textures/models/doors/silo_hatch.png b/src/main/resources/assets/hbm/textures/models/doors/silo_hatch.png new file mode 100644 index 0000000000000000000000000000000000000000..226f0c34d26c415c67e70f3f8eb974c19288e945 GIT binary patch literal 851 zcmeAS@N?(olHy`uVBq!ia0vp^9YDN-gAGVpi!Dn5QY^(zo*^7SP{WY|lw{`eba4!+ znDh4T!Ks(SBpL!U`Fba~I%zI!2}$%p`}qtN<>+1IoZPlAYo1Sk zcG6g`oqKtrMf^YM|J8DBg|AKjc=<=`H~dx;nB?G*pI6)P^77jLf~P;;Z?pZk*x1p7 zNs+U~_&V()VRw-#rzh z#^I@;(l|lPzB%UJ;q`YvZ+|v3Sxy+J9%#Y+yZ!6;cK`TYvisHh9mH$N=mXxl!Y==Bfwot>u;KkxhR3EQ3*SFa7foAj+h@q2||cEwlY6Z7<5%sZEw z+da?m-`)-7f8RZoDm1Y_I)TMWh~wq6{j;kro`2qUKIQR_SH@F0fns3CfFwN?mK^=9 z&|W>gFn50Pth%#Sbx&^nN_#hX2FSH6PM`GB)@6S$c%Nh;1meOqZsOl`;r7EXMfa2E zY>PY*zC84Mq7TTypnw7U35jvGPW*9oYX4D4_`nri>aLw|*Xr>uLbas3QP^Ouq-ftB3uJIX+Tx#YdwWUJf_9Pg$>{Ild^ zO@sW^yqDV_Zuu&dcM8oixUF!;rAP1ANX!4pPyJ!z1C7xwKa5wp*Rxgb|LiUSjT&GC zRJ{D${J-q8y!dN#N3mZPJ^X(s#M$vZ)|epr#&FXAbDj#?H-lB~&jb2q>iPfYAO5)@ ztvr3 Date: Thu, 18 Jan 2024 17:57:42 -0500 Subject: [PATCH 26/30] augh. --- .../hbm/tileentity/machine/TileEntityMachineStrandCaster.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java index 62f04d8e4..7bbecbc4d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java @@ -67,7 +67,7 @@ public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase if (this.amount >= this.getCapacity()) { //In case of overfill problems, spit out the excess as scrap if (amount > getCapacity()) { - ItemStack scrap = ItemScraps.create(new Mats.MaterialStack(type, amount)); + ItemStack scrap = ItemScraps.create(new Mats.MaterialStack(type, Math.max(amount - getCapacity(), amount))); EntityItem item = new EntityItem(worldObj, xCoord + 0.5, yCoord + 2, zCoord + 0.5, scrap); worldObj.spawnEntityInWorld(item); } From 3b83ac077ec278d053a80a9636424b926494c7a1 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Thu, 18 Jan 2024 18:01:55 -0500 Subject: [PATCH 27/30] Merge branch 'master' into roundtwo From 801c2155c7727e0f152b58b554398ec35b3a589f Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Thu, 18 Jan 2024 18:10:35 -0500 Subject: [PATCH 28/30] FUCK --- .../hbm/tileentity/machine/TileEntityMachineStrandCaster.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java index 8a1be5c06..3e78fb541 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java @@ -66,7 +66,7 @@ public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase if (this.amount >= this.getCapacity()) { //In case of overfill problems, spit out the excess as scrap if (amount > getCapacity()) { - ItemStack scrap = ItemScraps.create(new Mats.MaterialStack(type, Math.max(amount - getCapacity(), amount))); + ItemStack scrap = ItemScraps.create(new Mats.MaterialStack(type, Math.max(amount - getCapacity(), 0))); EntityItem item = new EntityItem(worldObj, xCoord + 0.5, yCoord + 2, zCoord + 0.5, scrap); worldObj.spawnEntityInWorld(item); } From a21955eefdbd59e9ff81b2ea4c038d645127506c Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 19 Jan 2024 11:14:25 +0100 Subject: [PATCH 29/30] silo hatch texture, door recipe changes --- changelog | 9 +++++++++ .../inventory/recipes/AssemblerRecipes.java | 15 ++++++++------- src/main/java/com/hbm/items/ModItems.java | 3 +++ .../java/com/hbm/items/tool/ItemBoltgun.java | 2 +- .../java/com/hbm/main/CraftingManager.java | 3 ++- .../hbm/render/item/ItemRenderLibrary.java | 17 +++++++++++++++++ src/main/resources/assets/hbm/lang/de_DE.lang | 3 +++ src/main/resources/assets/hbm/lang/en_US.lang | 3 +++ .../assets/hbm/textures/items/bolt_spike.png | Bin 0 -> 224 bytes .../hbm/textures/models/doors/silo_hatch.png | Bin 851 -> 10594 bytes .../textures/models/doors/silo_hatch_base.png | Bin 0 -> 1347 bytes 11 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/items/bolt_spike.png create mode 100644 src/main/resources/assets/hbm/textures/models/doors/silo_hatch_base.png diff --git a/changelog b/changelog index 22dc7d698..f0a283661 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,11 @@ +## Added +* Silo hatch + * The final missing door from 1.12, remade from scratch + * Comes with a brand-new model that fits perfectly over 3x3 missile launch tubes + * Has a 5x5 frame + +## Changed +* Simplified door recipes ## Fixed * Fixed sellafite emerald ore being oredicted as emerald dust @@ -6,3 +14,4 @@ * Fixed BFB rods being called ZFB in hot and depleted variants * Fixed infinite water barrels voiding water completely after the chemplant's input buffer runs full, infinite barrels can no longer void water in chemplants * Fixed fallout affecting things on Y:0 like bedrock ores and oil +* Fixed projectiles not being able to pass through open doors diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index 547df6609..f66125e0b 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -1212,13 +1212,14 @@ public class AssemblerRecipes { new OreDictStack(DURA.bolt(), 16), new ComparableStack(ModItems.motor, 2) }, 200); - makeRecipe(new ComparableStack(ModBlocks.large_vehicle_door, 1), new AStack[]{new OreDictStack(STEEL.plate(), 36), new OreDictStack("plateAdvancedAlloy", 4), new ComparableStack(ModItems.plate_polymer, 2), new OreDictStack("blockSteel", 4), new ComparableStack(ModItems.motor, 4), new OreDictStack(DURA.bolt(), 16), new OreDictStack("dyeGreen", 4)}, 500); - makeRecipe(new ComparableStack(ModBlocks.water_door, 1), new AStack[]{new OreDictStack(STEEL.plate(), 12), new OreDictStack("plateAdvancedAlloy", 2), new OreDictStack(DURA.bolt(), 4), new OreDictStack("dyeRed", 1)}, 500); - makeRecipe(new ComparableStack(ModBlocks.qe_containment, 1), new AStack[]{new OreDictStack(STEEL.plate(), 24), new OreDictStack("plateAdvancedAlloy", 8), new ComparableStack(ModItems.plate_polymer, 8), new OreDictStack("blockSteel", 2), new ComparableStack(ModItems.motor, 4), new OreDictStack(DURA.bolt(), 32), new OreDictStack("dyeBlack", 4)}, 500); - makeRecipe(new ComparableStack(ModBlocks.qe_sliding_door, 1), new AStack[]{new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModItems.plate_polymer, 2), new OreDictStack("blockSteel", 1), new ComparableStack(ModItems.motor, 2), new OreDictStack(DURA.bolt(), 4), new OreDictStack("dyeWhite", 4), new ComparableStack(Blocks.glass, 4)}, 200); - makeRecipe(new ComparableStack(ModBlocks.round_airlock_door, 1), new AStack[]{new OreDictStack(STEEL.plate(), 32), new OreDictStack("plateAdvancedAlloy", 12), new ComparableStack(ModItems.plate_polymer, 12), new OreDictStack("blockSteel", 6), new ComparableStack(ModItems.motor, 6), new OreDictStack(DURA.bolt(), 16), new OreDictStack("dyeGreen", 4)}, 500); - makeRecipe(new ComparableStack(ModBlocks.secure_access_door, 1), new AStack[]{new OreDictStack(STEEL.plate(), 48), new OreDictStack("plateAdvancedAlloy", 16), new ComparableStack(ModItems.plate_polymer, 2), new OreDictStack("blockSteel", 6), new ComparableStack(ModItems.motor, 4), new OreDictStack(DURA.bolt(), 32), new OreDictStack("dyeRed", 8)}, 1000); - makeRecipe(new ComparableStack(ModBlocks.sliding_seal_door, 1), new AStack[]{new OreDictStack(STEEL.plate(), 12), new OreDictStack("plateAdvancedAlloy", 4), new ComparableStack(ModItems.plate_polymer, 2), new OreDictStack("blockSteel", 1), new ComparableStack(ModItems.motor, 2), new OreDictStack(DURA.bolt(), 4), new OreDictStack("dyeWhite", 2)}, 500); + makeRecipe(new ComparableStack(ModBlocks.large_vehicle_door, 1), new AStack[]{new OreDictStack(STEEL.plateCast(), 16), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.motor, 4), new OreDictStack(DURA.bolt(), 16), new OreDictStack("dyeGreen", 4)}, 400); + makeRecipe(new ComparableStack(ModBlocks.water_door, 1), new AStack[]{new OreDictStack(STEEL.plate(), 16), new OreDictStack(DURA.bolt(), 4), new OreDictStack("dyeRed", 1)}, 200); + makeRecipe(new ComparableStack(ModBlocks.qe_containment, 1), new AStack[]{new OreDictStack(STEEL.plateCast(), 4), new OreDictStack(ALLOY.plate(), 4), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.motor, 2), new OreDictStack(DURA.bolt(), 32), new OreDictStack("dyeBlack", 4)}, 400); + makeRecipe(new ComparableStack(ModBlocks.qe_sliding_door, 1), new AStack[]{new OreDictStack(STEEL.plate(), 4), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.motor, 2), new OreDictStack(DURA.bolt(), 4), new OreDictStack("dyeWhite", 4), new ComparableStack(Blocks.glass, 4)}, 200); + makeRecipe(new ComparableStack(ModBlocks.round_airlock_door, 1), new AStack[]{new OreDictStack(STEEL.plateCast(), 12), new OreDictStack(ALLOY.plate(), 8), new ComparableStack(ModItems.plate_polymer, 16), new ComparableStack(ModItems.motor, 4), new OreDictStack(DURA.bolt(), 16), new OreDictStack("dyeGreen", 4)}, 400); + makeRecipe(new ComparableStack(ModBlocks.secure_access_door, 1), new AStack[]{new OreDictStack(STEEL.plateCast(), 12), new OreDictStack(ALLOY.plate(), 16), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.motor, 4), new OreDictStack(DURA.bolt(), 32), new OreDictStack("dyeRed", 8)}, 4000); + makeRecipe(new ComparableStack(ModBlocks.sliding_seal_door, 1), new AStack[]{new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.motor, 2), new OreDictStack(DURA.bolt(), 4), new OreDictStack("dyeWhite", 2)}, 200); + makeRecipe(new ComparableStack(ModBlocks.silo_hatch, 1), new AStack[]{new OreDictStack(STEEL.plateWelded(), 4), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.motor, 2), new OreDictStack(STEEL.bolt(), 16), new OreDictStack(KEY_GREEN, 4)}, 200); if(Loader.isModLoaded("Mekanism")) { diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index af65ba54f..a640258bd 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -330,6 +330,7 @@ public class ModItems { public static Item plate_dalekanium; public static Item plate_euphemium; public static Item bolt; + public static Item bolt_spike; public static Item bolt_compound; public static Item plate_polymer; public static Item plate_kevlar; @@ -2602,6 +2603,7 @@ public class ModItems { plate_dalekanium = new Item().setUnlocalizedName("plate_dalekanium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":plate_dalekanium"); plate_euphemium = new ItemCustomLore().setRarity(EnumRarity.epic).setUnlocalizedName("plate_euphemium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":plate_euphemium"); bolt = new ItemAutogen(MaterialShapes.BOLT).setUnlocalizedName("bolt").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":bolt"); + bolt_spike = new ItemCustomLore().setUnlocalizedName("bolt_spike").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":bolt_spike"); bolt_compound = new Item().setUnlocalizedName("bolt_compound").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":bolt_compound"); plate_polymer = new Item().setUnlocalizedName("plate_polymer").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":plate_polymer"); plate_kevlar = new Item().setUnlocalizedName("plate_kevlar").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":plate_kevlar"); @@ -6058,6 +6060,7 @@ public class ModItems { //Bolts GameRegistry.registerItem(bolt, bolt.getUnlocalizedName()); + GameRegistry.registerItem(bolt_spike, bolt_spike.getUnlocalizedName()); GameRegistry.registerItem(bolt_compound, bolt_compound.getUnlocalizedName()); //Cloth diff --git a/src/main/java/com/hbm/items/tool/ItemBoltgun.java b/src/main/java/com/hbm/items/tool/ItemBoltgun.java index 437aa97e2..b0d216289 100644 --- a/src/main/java/com/hbm/items/tool/ItemBoltgun.java +++ b/src/main/java/com/hbm/items/tool/ItemBoltgun.java @@ -50,7 +50,7 @@ public class ItemBoltgun extends Item implements IAnimatedItem { World world = player.worldObj; if(!entity.isEntityAlive()) return false; - ItemStack[] bolts = new ItemStack[] { Mats.MAT_STEEL.make(ModItems.bolt), Mats.MAT_TUNGSTEN.make(ModItems.bolt), Mats.MAT_DURA.make(ModItems.bolt)}; + ItemStack[] bolts = new ItemStack[] { new ItemStack(ModItems.bolt_spike), Mats.MAT_STEEL.make(ModItems.bolt), Mats.MAT_TUNGSTEN.make(ModItems.bolt), Mats.MAT_DURA.make(ModItems.bolt)}; for(ItemStack bolt : bolts) { for(int i = 0; i < player.inventory.getSizeInventory(); i++) { diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index b4fb99e14..b22fa676f 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -96,6 +96,7 @@ public class CraftingManager { addRecipeAuto(Mats.MAT_TUNGSTEN.make(ModItems.bolt, 16), new Object[] { "D", "D", 'D', W.ingot()}); addRecipeAuto(Mats.MAT_STEEL.make(ModItems.bolt, 16), new Object[] { "D", "D", 'D', STEEL.ingot()}); addRecipeAuto(Mats.MAT_DURA.make(ModItems.bolt, 16), new Object[] { "D", "D", 'D', DURA.ingot()}); + addRecipeAuto(new ItemStack(ModItems.bolt_spike, 2), new Object[] { "BB", "B ", "B ", 'B', STEEL.bolt()}); addRecipeAuto(new ItemStack(ModItems.pipes_steel, 1), new Object[] { "B", "B", "B", 'B', STEEL.block() }); addRecipeAuto(new ItemStack(ModItems.bolt_compound, 1), new Object[] { "PDP", "PTP", "PDP", 'D', DURA.bolt(), 'T', W.bolt(), 'P', TI.plate() }); addRecipeAuto(new ItemStack(ModItems.pellet_coal, 1), new Object[] { "PFP", "FOF", "PFP", 'P', COAL.dust(), 'F', Items.flint, 'O', ModBlocks.gravel_obsidian }); @@ -511,7 +512,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.rail_highspeed, 16), new Object[] { "S S", "SIS", "S S", 'S', STEEL.ingot(), 'I', IRON.plate() }); addRecipeAuto(new ItemStack(ModBlocks.rail_booster, 6), new Object[] { "S S", "CIC", "SRS", 'S', STEEL.ingot(), 'I', IRON.plate(), 'R', MINGRADE.ingot(), 'C', ModItems.coil_copper }); - addRecipeAuto(new ItemStack(ModBlocks.rail_large_straight, 4), new Object[] { "B B", "SSS", "W W", 'B', STEEL.bolt(), 'S', ModBlocks.steel_beam, 'W', KEY_SLAB }); + addRecipeAuto(new ItemStack(ModBlocks.rail_large_straight, 4), new Object[] { "B B", "SSS", "W W", 'B', ModItems.bolt_spike, 'S', ModBlocks.steel_beam, 'W', KEY_SLAB }); addShapelessAuto(new ItemStack(ModBlocks.rail_large_straight, 1), new Object[] { ModBlocks.rail_large_straight_short, ModBlocks.rail_large_straight_short, ModBlocks.rail_large_straight_short, ModBlocks.rail_large_straight_short, ModBlocks.rail_large_straight_short }); addShapelessAuto(new ItemStack(ModBlocks.rail_large_straight_short, 5), new Object[] { ModBlocks.rail_large_straight }); addRecipeAuto(new ItemStack(ModBlocks.rail_large_buffer, 1), new Object[] { " S", "RS", 'R', ModBlocks.rail_large_straight, 'S', STEEL.ingot() }); diff --git a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java index 4b25b2f23..cec57ea6d 100644 --- a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java +++ b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java @@ -730,6 +730,23 @@ public class ItemRenderLibrary { GL11.glShadeModel(GL11.GL_FLAT); } }); + renderers.put(Item.getItemFromBlock(ModBlocks.silo_hatch), new ItemRenderBase(){ + public void renderInventory() { + GL11.glTranslated(0, -2, 0); + GL11.glScaled(2, 2, 2); + } + public void renderCommon() { + bindTexture(ResourceManager.silo_hatch_tex); + GL11.glShadeModel(GL11.GL_SMOOTH); + GL11.glRotated(90, 0, 1, 0); + ResourceManager.silo_hatch.renderPart("Frame"); + GL11.glTranslated(0, 0.875, -1.875); + GL11.glRotated(-120, 1, 0, 0); + GL11.glTranslated(0, -0.875, 1.875); + ResourceManager.silo_hatch.renderPart("Hatch"); + GL11.glShadeModel(GL11.GL_FLAT); + } + }); renderers.put(Item.getItemFromBlock(ModBlocks.qe_containment), new ItemRenderBase(){ public void renderInventory() { GL11.glTranslated(0, -3.5, 0); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index d89423eae..a4220206f 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -1294,6 +1294,7 @@ item.bobmazon_tools.name=Bobmazon: Werkzeuge item.bobmazon_weapons.name=Bobmazon: Waffen und Sprengstoffe item.bolt.name=%sbolzen item.bolt_compound.name=Verstärkte Turbinenwelle +item.bolt_spike.name=Gleisnagel item.boltgun.name=Pneumatische Nietenpistole item.bomb_caller.name=Luftschlag Zielmarker item.bomb_waffle.name=Massenvernichtungswaffel @@ -4471,6 +4472,8 @@ tile.sellafield_4.name=Infernales Sellafit tile.sellafield_core.name=Sellafit-Corium tile.sellafield_slaked.name=Gelöschtes Sellafit tile.semtex.name=Semtex +tile.silo_hatch.name=Siloluke +tile.sliding_blast_door.name=Sprengtür tile.solar_mirror.name=Heliostatspiegel tile.soyuz_capsule.name=Landekapsel tile.soyuz_launcher.name=Soyuz-Startplatform diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 2d45971c6..05365875c 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1961,6 +1961,8 @@ item.bobmazon_tools.name=Bobmazon: Tools item.bobmazon_weapons.name=Bobmazon: Weapons and Explosives item.bolt.name=%s Bolt item.bolt_compound.name=Reinforced Turbine Shaft +item.bolt_spike.name=Railroad Spike +item.bolt_spike.desc=Radiates a threatening aura, somehow item.boltgun.name=Pneumatic Rivet Gun item.bomb_caller.name=Airstrike Designator item.bomb_waffle.name=Waffle of Mass Destruction @@ -5474,6 +5476,7 @@ tile.sellafield.4.name=Infernal Sellafite tile.sellafield.5.name=Sellafite-Corium tile.sellafield_slaked.name=Slaked Sellafite tile.semtex.name=Semtex +tile.silo_hatch.name=Silo Hatch tile.sliding_blast_door.name=Sliding Blast Door tile.solar_mirror.name=Heliostat Mirror tile.soyuz_capsule.name=Cargo Landing Capsule diff --git a/src/main/resources/assets/hbm/textures/items/bolt_spike.png b/src/main/resources/assets/hbm/textures/items/bolt_spike.png new file mode 100644 index 0000000000000000000000000000000000000000..88e310d5f4ec55a0292b6cb8438aa6953647d4c1 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfaSXBO zecR{D)odW(Hh-zWBen1X(G#^tl%LdD_M{64KGHMPTB6OWyVQQR-mUGGXAJJ2IWYfy z@EqxDw_>KL26>qsm*7-<^X|9Y^BBeg))lX`gwRzd&( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/doors/silo_hatch.png b/src/main/resources/assets/hbm/textures/models/doors/silo_hatch.png index 226f0c34d26c415c67e70f3f8eb974c19288e945..7a85f0e33d9c155a36c562bf6de046a49f879486 100644 GIT binary patch literal 10594 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 literal 851 zcmeAS@N?(olHy`uVBq!ia0vp^9YDN-gAGVpi!Dn5QY^(zo*^7SP{WY|lw{`eba4!+ znDh4T!Ks(SBpL!U`Fba~I%zI!2}$%p`}qtN<>+1IoZPlAYo1Sk zcG6g`oqKtrMf^YM|J8DBg|AKjc=<=`H~dx;nB?G*pI6)P^77jLf~P;;Z?pZk*x1p7 zNs+U~_&V()VRw-#rzh z#^I@;(l|lPzB%UJ;q`YvZ+|v3Sxy+J9%#Y+yZ!6;cK`TYvisHh9mH$N=mXxl!Y==Bfwot>u;KkxhR3EQ3*SFa7foAj+h@q2||cEwlY6Z7<5%sZEw z+da?m-`)-7f8RZoDm1Y_I)TMWh~wq6{j;kro`2qUKIQR_SH@F0fns3CfFwN?mK^=9 z&|W>gFn50Pth%#Sbx&^nN_#hX2FSH6PM`GB)@6S$c%Nh;1meOqZsOl`;r7EXMfa2E zY>PY*zC84Mq7TTypnw7U35jvGPW*9oYX4D4_`nri>aLw|*Xr>uLbas3QP^Ouq-ftB3uJIX+Tx#YdwWUJf_9Pg$>{Ild^ zO@sW^yqDV_Zuu&dcM8oixUF!;rAP1ANX!4pPyJ!z1C7xwKa5wp*Rxgb|LiUSjT&GC zRJ{D${J-q8y!dN#N3mZPJ^X(s#M$vZ)|epr#&FXAbDj#?H-lB~&jb2q>iPfYAO5)@ ztvr3Eakt zG3V{w^V!nw630H4ua#e>80h`jOvP-kL~@YkQvyNYsr`$^mR-Mm!CB+(rG^EG-U z+42{w!d1@&_q?_`aQgA#1+TT%Jx-O)kn`12VPabOVe^dHCw(urJ2V!tFZuuL#kQ-t zy0+0PohS9SFI_{c1a}nkb)1enx~(*}zV_jb?83(~6K<4S zS#F;BTxP*XT3Wq&#LE%I!2aZs>iS9#XDY{vcD%gk0O7}iZN+@~&Y7RPRBzt;ok z`oK9xeQncQl3QbJPh?cg^vVDC)pVKyNBgr>Rnse9~moyLC z_PufE&z!krvUTs?y-xk+a{X`ref0D5+w(0XL;$D^=tQ8Mf*@wlyUTaNs=Gx!6@7s* zc0#q>Vb-?kh7vqldmU$*+FdUd5<4ZcHtL7h<&w;;Gjx+gQ?DA<%1)PK5fVLevBIY8 z*LTIL387bWgjtRRUXzjA<^FN6xU&P7*dq3ioj^qhdw|R%nR$NQ-=%l{`f_jGySoez zv%c*6V0g!V-uvJ41qAq$_NJfuQsw1P)A{zN(dOr`FEl$SDNNwt0LE-*12R+VOWfNP z_RAZN?0VjC^%|c?PBm`?zb#Z<)XnBI>)0JO>+*8=#~wO!N93@S`?h7ZZpET4rF=TG zxH+pF7iZb;_?xQ_lBrfvoeI6{OYu>F4A0?9%9q zx`ICYe1Pd@X_JF8)I}@LmdXd*iuujhs>v2~yXUoo+0~X;)#bJxIo!6c*+* z{qyPDWhP0Hv+f*7uiI_^_i?i1;}vV}ZB}2{E^sAkdwoXvtjgng^ECYUn|P37W~ZNj z(#ub?tEO%1yEFexM#amoksnj7U%dakmA?^~#DZ#CCnmsLx#!nX`KL*@cbgw>X{h+{?yNy)u4~ygCqD-pNnZWQ(~q|Y zwmkXsmpma%HRp4*0O*^)`IdBDBzxyzC_vblB9ag1Z(bk*xI_1m?g%b{}nhdra zQq3swfjyQ;5j|BqziHR~$=p%v8m@e`lZcQH=0S?}C0qTRlXksVzmvkY>$;S?^ zCmTw(S*P|gi@Nf|6UUO>YNprH&nwU07J27 Date: Fri, 19 Jan 2024 14:33:28 +0100 Subject: [PATCH 30/30] why are there so many foxes, make it stop --- changelog | 3 +++ .../com/hbm/entity/mob/EntityGlyphid.java | 1 - .../hbm/entity/mob/EntityGlyphidDigger.java | 6 +++--- .../hbm/entity/mob/EntityGlyphidScout.java | 19 ++++++++++++++++++ .../handler/pollution/PollutionHandler.java | 14 +++++++------ .../gui/processing/gui_strand_caster.png | Bin 16344 -> 11637 bytes 6 files changed, 33 insertions(+), 10 deletions(-) diff --git a/changelog b/changelog index f0a283661..8c5d6df54 100644 --- a/changelog +++ b/changelog @@ -15,3 +15,6 @@ * Fixed infinite water barrels voiding water completely after the chemplant's input buffer runs full, infinite barrels can no longer void water in chemplants * Fixed fallout affecting things on Y:0 like bedrock ores and oil * Fixed projectiles not being able to pass through open doors +* Fixed material dupe caused by strand caster overflowing +* Fixed rampant mode glyphid scout spawn ignoring light level +* Fixed glyphid diggers' debris attack being able to break concrete diff --git a/src/main/java/com/hbm/entity/mob/EntityGlyphid.java b/src/main/java/com/hbm/entity/mob/EntityGlyphid.java index c0cbb40f2..b9e88e699 100644 --- a/src/main/java/com/hbm/entity/mob/EntityGlyphid.java +++ b/src/main/java/com/hbm/entity/mob/EntityGlyphid.java @@ -23,7 +23,6 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EnumCreatureAttribute; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/com/hbm/entity/mob/EntityGlyphidDigger.java b/src/main/java/com/hbm/entity/mob/EntityGlyphidDigger.java index f0c8d6a12..354162f3f 100644 --- a/src/main/java/com/hbm/entity/mob/EntityGlyphidDigger.java +++ b/src/main/java/com/hbm/entity/mob/EntityGlyphidDigger.java @@ -1,5 +1,6 @@ package com.hbm.entity.mob; +import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityRubble; import com.hbm.lib.Library; import com.hbm.main.ResourceManager; @@ -9,7 +10,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.init.Blocks; -import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; import net.minecraft.util.Vec3; import net.minecraft.world.World; @@ -126,9 +126,9 @@ public class EntityGlyphidDigger extends EntityGlyphid { Block b = worldObj.getBlock(x1, y1, z1); - float k = b.getExplosionResistance(null); + float k = b.getExplosionResistance(this, worldObj, x1, y1, z1, posX, posY, posZ); - if (k < 200 && b.isNormalCube()) { + if (k < ModBlocks.concrete.getExplosionResistance(this) && b.isNormalCube()) { EntityRubble rubble = new EntityRubble(worldObj); rubble.posX = x1 + 0.5F; diff --git a/src/main/java/com/hbm/entity/mob/EntityGlyphidScout.java b/src/main/java/com/hbm/entity/mob/EntityGlyphidScout.java index 4d1e08a89..e6a5a4564 100644 --- a/src/main/java/com/hbm/entity/mob/EntityGlyphidScout.java +++ b/src/main/java/com/hbm/entity/mob/EntityGlyphidScout.java @@ -325,4 +325,23 @@ public class EntityGlyphidScout extends EntityGlyphid { } return PollutionHandler.targetCoords; } + + /** Vanilla implementation, minus the RNG */ + @Override + public boolean isValidLightLevel() { + int x = MathHelper.floor_double(this.posX); + int y = MathHelper.floor_double(this.boundingBox.minY); + int z = MathHelper.floor_double(this.posZ); + + int light = this.worldObj.getBlockLightValue(x, y, z); + + if(this.worldObj.isThundering()) { + int skylightSubtracted = this.worldObj.skylightSubtracted; + this.worldObj.skylightSubtracted = 10; + light = this.worldObj.getBlockLightValue(x, y, z); + this.worldObj.skylightSubtracted = skylightSubtracted; + } + + return light <= 7; + } } diff --git a/src/main/java/com/hbm/handler/pollution/PollutionHandler.java b/src/main/java/com/hbm/handler/pollution/PollutionHandler.java index 934a0524b..61c6e9bc4 100644 --- a/src/main/java/com/hbm/handler/pollution/PollutionHandler.java +++ b/src/main/java/com/hbm/handler/pollution/PollutionHandler.java @@ -364,12 +364,14 @@ public class PollutionHandler { if (soot >= MobConfig.rampantScoutSpawnThresh) { EntityGlyphidScout scout = new EntityGlyphidScout(event.world); - //escort for the scout, which can also deal with obstacles - EntityGlyphidDigger digger = new EntityGlyphidDigger(event.world); - scout.setLocationAndAngles(event.x, event.y, event.z, event.world.rand.nextFloat() * 360.0F, 0.0F); - digger.setLocationAndAngles(event.x, event.y, event.z, event.world.rand.nextFloat() * 360.0F, 0.0F); - event.world.spawnEntityInWorld(scout); - event.world.spawnEntityInWorld(digger); + if(scout.isValidLightLevel()) { + //escort for the scout, which can also deal with obstacles + EntityGlyphidDigger digger = new EntityGlyphidDigger(event.world); + scout.setLocationAndAngles(event.x, event.y, event.z, event.world.rand.nextFloat() * 360.0F, 0.0F); + digger.setLocationAndAngles(event.x, event.y, event.z, event.world.rand.nextFloat() * 360.0F, 0.0F); + event.world.spawnEntityInWorld(scout); + event.world.spawnEntityInWorld(digger); + } } } } diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_strand_caster.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_strand_caster.png index 9f3253374240386f1091cfcace39043063e5c338..2af67e09eb749ed526c61c2ef58bd3f7ff5bd5e1 100644 GIT binary patch literal 11637 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 literal 16344 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