diff --git a/changelog b/changelog index 20261ecff..39319f886 100644 --- a/changelog +++ b/changelog @@ -1,44 +1,7 @@ -## Added -* Refueling station - * Like a charging station, but for fluids - ## Changed -* Updated chinese localization -* Particle detectors now print an error for when the recipe could not be completed -* Night Vision Goggles toggles with armor HUD -* Removed "no ore dict data" line from tooltips with extended view enabled -* Added a client config called `GUN_ANIMATION_SPEED` which allows the speed of gun animations to be changed - * Mostly for debugging, since it only applies to the bus animation system, things like smoke trails and muzzle flashes are unaffected -* Item filters can now filter by bedrock ore grade -* Meteorite dungeons now use a new structure system - * The rooms have been completely changed, and the dungeons are no longer single-level with fixed room sizes - * Dungeons no longer lag the game to hell when generating -* Decimated bobmazon - * All books have been merged into one with way fewer offers - * Sells things like basic gear, MREs, plushies, snow globes, and certain things only found in worldgen like jungle tree saplings and NTM flowers (including mustard willow) -* Each acidizer recipe now has a "productivity" value which is the percent chance that the effectiveness upgrades use, instead of a fixed 5% per level - * This means that certain recipes like re-crystallizing gems no longer allow for item duping - * Due to duping no longer being a concern, productivity rates for certain recipes can now be much higher - * Things like sawdust to cordite have a 75% chance of not using the input at level 3 - * Effectiveness no longer increases acid consumption (since many recipes now use the acidizer like a solid output "mixer") but instead adds +200% power consumption per level - * Effectiveness can be configured with the recipe and caps out at 99% (since 100% would just print free items) -* Chemical dyes can now also be made with light oil -* There's now statistics for creating legendary weapons and ammo, stepping on landmines and firing guns -* Assembly templates no longer specify whether they are persistent and volatile, since volatile templates haven't existed in years -* Obliterated the HTR-01 item for good - * Idk why it still existed -* Skeletons, slimes and cybercrabs can no longer be gibbed, since they don't have flesh -* The template folder's description now uses flashing colors to make it harder to ignore -* Scaled swords no longer use 1.1 scale in the inventory, making them larger than the inventory slot -* Fissures can now be connected to fluid ducts, providing 1,000mB of lava per tick +* Large deposits (hematite, malachite, bauxite) and caves (sulfur, asbestos) can now be toggled in the config +* Removed recipes for most old particle accelerator parts +* Dense coils no longer have recipes either for the most part, all coils with no recipes can be recycled back into dense wires ## Fixed -* Fixed items being annihilated when shift clicking them into the particle source -* Fixed packet optimization not allowing packets to be sent when the day night cycle is halted -* Fixed particle detectors not always using power when they should -* Fixed rotary furnace voiding low pressure steam when dealing with input numbers not divisible by 100 -* Fixed state leak causing smoke from the right akimbo weapon to glow when the first one is fired -* Fixed incorrect default values for new RBMK dials -* Fixed blast doors self-destructing when closing -* Fixed PA coils being in the wrong creative tab -* Fixed flux calculation for RBMKs being wrong, mainly affecting reactors using fast flux +* Fixed an issue where `/ntmreload` would load fluids after recipes, meaning that recipes using newly added fluids would not work correctly, as the fluids don't exist by the time the recipe is loaded \ No newline at end of file diff --git a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java index 6643e3fcd..e933cdf22 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java @@ -2,6 +2,8 @@ package api.hbm.energymk2; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; +import com.hbm.uninos.IGenProvider; +import com.hbm.uninos.networkproviders.PowerProvider; import com.hbm.util.Compat; import api.hbm.energymk2.Nodespace.PowerNode; @@ -12,7 +14,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; /** If it sends energy, use this */ -public interface IEnergyProviderMK2 extends IEnergyHandlerMK2 { +public interface IEnergyProviderMK2 extends IEnergyHandlerMK2, IGenProvider { /** Uses up available power, default implementation has no sanity checking, make sure that the requested power is lequal to the current power */ public default void usePower(long power) { diff --git a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java index 6ff96df42..47fb07a89 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java @@ -3,6 +3,8 @@ package api.hbm.energymk2; import com.hbm.interfaces.NotableComments; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; +import com.hbm.uninos.IGenReceiver; +import com.hbm.uninos.networkproviders.PowerProvider; import com.hbm.util.Compat; import api.hbm.energymk2.Nodespace.PowerNode; @@ -14,7 +16,7 @@ import net.minecraftforge.common.util.ForgeDirection; /** If it receives energy, use this */ @NotableComments -public interface IEnergyReceiverMK2 extends IEnergyHandlerMK2 { +public interface IEnergyReceiverMK2 extends IEnergyHandlerMK2, IGenReceiver { public default long transferPower(long power) { if(power + this.getPower() <= this.getMaxPower()) { @@ -76,31 +78,6 @@ public interface IEnergyReceiverMK2 extends IEnergyHandlerMK2 { } } - /** - * Project MKUltra was an illegal human experiments program designed and undertaken by the U.S. Central Intelligence Agency (CIA) - * to develop procedures and identify drugs that could be used during interrogations to weaken people and force confessions through - * brainwashing and psychological torture. It began in 1953 and was halted in 1973. MKUltra used numerous methods to manipulate - * its subjects' mental states and brain functions, such as the covert administration of high doses of psychoactive drugs (especially LSD) - * and other chemicals without the subjects' consent, electroshocks, hypnosis, sensory deprivation, isolation, verbal and sexual - * abuse, and other forms of torture. - * MKUltra was preceded by Project Artichoke. It was organized through the CIA's Office of Scientific Intelligence and coordinated - * with the United States Army Biological Warfare Laboratories. The program engaged in illegal activities, including the - * use of U.S. and Canadian citizens as unwitting test subjects. MKUltra's scope was broad, with activities carried - * out under the guise of research at more than 80 institutions aside from the military, including colleges and universities, - * hospitals, prisons, and pharmaceutical companies. The CIA operated using front organizations, although some top officials at these - * institutions were aware of the CIA's involvement. - * MKUltra was revealed to the public in 1975 by the Church Committee of the United States Congress and Gerald Ford's United States - * President's Commission on CIA activities within the United States (the Rockefeller Commission). Investigative efforts were hampered - * by CIA Director Richard Helms's order that all MKUltra files be destroyed in 1973; the Church Committee and Rockefeller Commission - * investigations relied on the sworn testimony of direct participants and on the small number of documents that survived Helms's order. - * In 1977, a Freedom of Information Act request uncovered a cache of 20,000 documents relating to MKUltra, which led to Senate hearings. - * Some surviving information about MKUltra was declassified in 2001. - * */ - public default ConnectionPriority getPriority() { - return ConnectionPriority.NORMAL; - } - - /** More is better-er */ public enum ConnectionPriority { LOWEST, LOW, diff --git a/src/main/java/com/hbm/commands/CommandReloadRecipes.java b/src/main/java/com/hbm/commands/CommandReloadRecipes.java index 9068adb38..b73da42fd 100644 --- a/src/main/java/com/hbm/commands/CommandReloadRecipes.java +++ b/src/main/java/com/hbm/commands/CommandReloadRecipes.java @@ -26,10 +26,10 @@ public class CommandReloadRecipes extends CommandBase { @Override public void processCommand(ICommandSender sender, String[] args) { try { + Fluids.reloadFluids(); SerializableRecipe.initialize(); ItemPoolConfigJSON.initialize(); DamageResistanceHandler.init(); - Fluids.reloadFluids(); sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Reload complete :)")); } catch(Exception ex) { diff --git a/src/main/java/com/hbm/config/WorldConfig.java b/src/main/java/com/hbm/config/WorldConfig.java index 7bb0faf58..0eb14c026 100644 --- a/src/main/java/com/hbm/config/WorldConfig.java +++ b/src/main/java/com/hbm/config/WorldConfig.java @@ -74,6 +74,13 @@ public class WorldConfig { public static int endTikiteSpawn = 8; + public static boolean enableHematite = true; + public static boolean enableMalachite = true; + public static boolean enableBauxite = true; + + public static boolean enableSulfurCave = true; + public static boolean enableAsbestosCave = true; + public static int radioStructure = 500; public static int antennaStructure = 250; public static int atomStructure = 500; @@ -189,6 +196,13 @@ public class WorldConfig { endTikiteSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.E00_tikiteSpawnrate", "Amount of end trixite per chunk", 8); + enableHematite = CommonConfig.createConfigBool(config, CATEGORY_OREGEN, "2.L00_enableHematite", "Toggles hematite deposits", true); + enableMalachite = CommonConfig.createConfigBool(config, CATEGORY_OREGEN, "2.L01_enableMalachite", "Toggles malachite deposits", true); + enableBauxite = CommonConfig.createConfigBool(config, CATEGORY_OREGEN, "2.L02_enableBauxite", "Toggles bauxite deposits", true); + + enableSulfurCave = CommonConfig.createConfigBool(config, CATEGORY_OREGEN, "2.C00_enableSulfurCave", "Toggles sulfur caves", true); + enableAsbestosCave = CommonConfig.createConfigBool(config, CATEGORY_OREGEN, "2.C01_enableAsbestosCave", "Toggles asbestos caves", true); + final String CATEGORY_DUNGEON = CommonConfig.CATEGORY_DUNGEONS; radioStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.00_radioSpawn", "Spawn radio station on every nTH chunk", 500); antennaStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.01_antennaSpawn", "Spawn antenna on every nTH chunk", 250); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index e3e16a140..c1949152a 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -79,7 +79,7 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModItems.rtg_unit, 1), new AStack[] {new ComparableStack(ModItems.thermo_element, 2), new OreDictStack(CU.plateCast(), 1), new OreDictStack(PB.ingot(), 2), new OreDictStack(STEEL.plate(), 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CAPACITOR.ordinal()), },100); makeRecipe(new ComparableStack(ModItems.levitation_unit, 1), new AStack[] {new ComparableStack(ModItems.coil_copper, 4), new ComparableStack(ModItems.coil_tungsten, 2), new OreDictStack(TI.plate(), 6), new ComparableStack(ModItems.nugget_schrabidium, 2), },100); makeRecipe(new ComparableStack(ModItems.drill_titanium, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 2), new OreDictStack(DURA.ingot(), 2), new OreDictStack(DURA.bolt(), 4), new OreDictStack(TI.plate(), 6), },100); - makeRecipe(new ComparableStack(ModItems.entanglement_kit, 1), new AStack[] {new OreDictStack(STEEL.plate(), 8), new OreDictStack(DURA.ingot(), 4), new OreDictStack(CU.plate(), 24), new ComparableStack(ModBlocks.hadron_coil_gold, 4), new OreDictStack(Fluids.XENON.getDict(1_000))},200); + makeRecipe(new ComparableStack(ModItems.entanglement_kit, 1), new AStack[] {new OreDictStack(STEEL.plate(), 8), new OreDictStack(DURA.ingot(), 4), new OreDictStack(CU.plate(), 24), new OreDictStack(GOLD.wireDense(), 16), new OreDictStack(Fluids.XENON.getDict(1_000))},200); makeRecipe(new ComparableStack(ModItems.dysfunctional_reactor, 1), new AStack[] {new OreDictStack(STEEL.plate(), 15), new OreDictStack(PB.ingot(), 5), new ComparableStack(ModItems.rod_quad_empty, 10), new OreDictStack("dyeBrown", 3), },200); makeRecipe(new ComparableStack(ModItems.missile_assembly, 1), new AStack[] {new OreDictStack(STEEL.shell(), 2), new OreDictStack(AL.shell(), 2), new OreDictStack(TI.plate(), 8), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.rocket_fuel, 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC), }, 200); makeRecipe(new ComparableStack(ModItems.warhead_generic_small, 1), new AStack[] {new OreDictStack(TI.plate(), 5), new OreDictStack(STEEL.plate(), 3), new ComparableStack(ModItems.ball_dynamite, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CHIP) },100); @@ -552,8 +552,7 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModBlocks.machine_cyclotron, 1), new AStack[] { new ComparableStack(ModBlocks.machine_lithium_battery, 3), - new ComparableStack(ModBlocks.hadron_coil_neodymium, 8), - new OreDictStack(ALLOY.wireDense(), 16), + new OreDictStack(ND.wireDense(), 32), !exp ? new OreDictStack(STEEL.ingot(), 16) : new OreDictStack(STEEL.heavyComp(), 3), new OreDictStack(STEEL.plate528(), 32), new OreDictStack(AL.plate528(), 32), @@ -1149,16 +1148,6 @@ public class AssemblerRecipes extends SerializableRecipe { new ComparableStack(ModItems.circuit, 10, EnumCircuitType.CAPACITOR_BOARD), }, 300); - makeRecipe(new ComparableStack(ModBlocks.hadron_core, 1), new AStack[] { - new ComparableStack(ModBlocks.hadron_coil_alloy, 24), - new OreDictStack(STEEL.ingot(), 8), - new OreDictStack(ANY_PLASTIC.ingot(), 16), - new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), - new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BISMOID), - new ComparableStack(ModItems.circuit, 192, EnumCircuitType.CAPACITOR_BOARD), - new ComparableStack(ModItems.crt_display, 1), - }, 300); - makeRecipe(new ComparableStack(ModBlocks.struct_launcher_core, 1), new AStack[] { new ComparableStack(ModBlocks.machine_battery, 3), new ComparableStack(ModBlocks.steel_scaffold, 10), diff --git a/src/main/java/com/hbm/inventory/recipes/MagicRecipes.java b/src/main/java/com/hbm/inventory/recipes/MagicRecipes.java index dfb802485..863f76c25 100644 --- a/src/main/java/com/hbm/inventory/recipes/MagicRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/MagicRecipes.java @@ -56,18 +56,6 @@ public class MagicRecipes { new ComparableStack(ModItems.powder_dineutronium), new ComparableStack(ModItems.blades_desh), new ComparableStack(ModItems.diamond_gavel))); - - recipes.add(new MagicRecipe(new ItemStack(ModBlocks.hadron_coil_mese), - new ComparableStack(ModBlocks.hadron_coil_chlorophyte), - new ComparableStack(ModItems.powder_dineutronium), - new ComparableStack(ModItems.plate_desh), - new OreDictStack(GOLD.dust()))); - - recipes.add(new MagicRecipe(new ItemStack(ModBlocks.hadron_coil_mese), - new ComparableStack(ModBlocks.hadron_coil_chlorophyte), - new OreDictStack(DNT.wireDense()), - new OreDictStack(W.wireDense()), - new OreDictStack(GOLD.wireDense()))); } public static List getRecipes() { diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 13d95c8c7..c1cc4e40c 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -775,39 +775,50 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.mech_key, 1), new Object[] { "MCM", "MKM", "MMM", 'M', ModItems.ingot_meteorite_forged, 'C', ModItems.coin_maskman, 'K', ModItems.key }); addRecipeAuto(new ItemStack(ModItems.spawn_ufo, 1), new Object[] { "MMM", "DCD", "MMM", 'M', ModItems.ingot_meteorite, 'D', DNT.ingot(), 'C', ModItems.coin_worm }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_alloy, 1), new Object[] { "WWW", "WCW", "WWW", 'W', ALLOY.wireFine(), 'C', ModBlocks.fusion_conductor }); + addShapelessAuto(new ItemStack(ModItems.wire_dense, 4, Mats.MAT_GOLD.id), new Object[] { ModBlocks.hadron_coil_gold }); + addShapelessAuto(new ItemStack(ModItems.wire_dense, 4, Mats.MAT_NEODYMIUM.id), new Object[] { ModBlocks.hadron_coil_neodymium }); + addShapelessAuto(new ItemStack(ModItems.wire_dense, 4, Mats.MAT_MAGTUNG.id), new Object[] { ModBlocks.hadron_coil_magtung }); + addShapelessAuto(new ItemStack(ModItems.wire_dense, 2, Mats.MAT_SCHRABIDIUM.id), new Object[] { ModBlocks.hadron_coil_schrabidium }); + addShapelessAuto(new ItemStack(ModItems.wire_dense, 2, Mats.MAT_SCHRABIDATE.id), new Object[] { ModBlocks.hadron_coil_schrabidate }); + addShapelessAuto(new ItemStack(ModItems.wire_dense, 2, Mats.MAT_STAR.id), new Object[] { ModBlocks.hadron_coil_starmetal }); + addShapelessAuto(new ItemStack(ModItems.powder_chlorophyte, 2), new Object[] { ModBlocks.hadron_coil_chlorophyte }); + addShapelessAuto(new ItemStack(ModItems.wire_dense, 1, Mats.MAT_DNT.id), new Object[] { ModBlocks.hadron_coil_mese }); + addShapelessAuto(new ItemStack(ModItems.plate_cast, 1, Mats.MAT_STEEL.id), new Object[] { ModBlocks.hadron_plating }); + addShapelessAuto(new ItemStack(ModItems.plate_cast, 1, Mats.MAT_STEEL.id), new Object[] { ModBlocks.hadron_plating_blue }); + addShapelessAuto(new ItemStack(ModItems.plate_cast, 1, Mats.MAT_STEEL.id), new Object[] { ModBlocks.hadron_plating_black }); + addShapelessAuto(new ItemStack(ModItems.plate_cast, 1, Mats.MAT_STEEL.id), new Object[] { ModBlocks.hadron_plating_yellow }); + addShapelessAuto(new ItemStack(ModItems.plate_cast, 1, Mats.MAT_STEEL.id), new Object[] { ModBlocks.hadron_plating_striped }); + addShapelessAuto(new ItemStack(ModItems.plate_cast, 1, Mats.MAT_STEEL.id), new Object[] { ModBlocks.hadron_plating_glass }); + addShapelessAuto(new ItemStack(ModItems.plate_cast, 1, Mats.MAT_STEEL.id), new Object[] { ModBlocks.hadron_plating_voltz }); + addShapelessAuto(DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), new Object[] { ModBlocks.hadron_analysis }); + addShapelessAuto(DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), new Object[] { ModBlocks.hadron_analysis_glass }); + addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_alloy, 1), new Object[] { "WW", "WW", 'W', ALLOY.wireDense() }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_gold, 1), new Object[] { "PGP", "PCP", "PGP", 'G', GOLD.dust(), 'C', ModBlocks.hadron_coil_alloy, 'P', IRON.plate() }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_gold, 1), new Object[] { "WG", "GW", 'W', ALLOY.wireDense(), 'G', GOLD.wireDense() }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_neodymium, 1), new Object[] { "G", "C", "G", 'G', ND.dust(), 'C', ModBlocks.hadron_coil_gold }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_neodymium, 1), new Object[] { "WG", "GW", 'W', ND.wireDense(), 'G', GOLD.wireDense() }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_magtung, 1), new Object[] { "WW", "WW", 'W', MAGTUNG.wireDense() }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_schrabidium, 1), new Object[] { "WWW", "WCW", "WWW", 'W', SA326.wireFine(), 'C', ModBlocks.hadron_coil_magtung }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_schrabidium, 1), new Object[] { "WS", "SW", 'W', MAGTUNG.wireDense(), 'S', SA326.wireDense() }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_schrabidate, 1), new Object[] { " S ", "SCS", " S ", 'S', SBD.dust(), 'C', ModBlocks.hadron_coil_schrabidium }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_schrabidate, 1), new Object[] { "WS", "SW", 'W', SBD.wireDense(), 'S', SA326.wireDense() }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_starmetal, 1), new Object[] { "SNS", "SCS", "SNS", 'S', STAR.ingot(), 'N', ModBlocks.hadron_coil_neodymium, 'C', ModBlocks.hadron_coil_schrabidate }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_starmetal, 1), new Object[] { "SW", "WS", 'W', SBD.wireDense(), 'S', STAR.wireDense() }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_chlorophyte, 1), new Object[] { "TCT", "TST", "TCT", 'T', ModItems.coil_tungsten, 'C', ModItems.powder_chlorophyte, 'S', ModBlocks.hadron_coil_starmetal }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_chlorophyte, 1), new Object[] { "TC", "CT", 'T', W.wireDense(), 'C', ModItems.powder_chlorophyte }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_diode, 1), new Object[] { "CIC", "ISI", "CIC", 'C', ModBlocks.hadron_coil_alloy, 'I', STEEL.ingot(), 'S', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED) }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_plating, 16), new Object[] { "CC", "CC", 'C', STEEL.plateCast()}); - addShapelessAuto(new ItemStack(ModBlocks.hadron_plating_blue, 1), new Object[] { ModBlocks.hadron_plating, KEY_BLUE }); - addShapelessAuto(new ItemStack(ModBlocks.hadron_plating_black, 1), new Object[] { ModBlocks.hadron_plating, KEY_BLACK }); - addShapelessAuto(new ItemStack(ModBlocks.hadron_plating_yellow, 1), new Object[] { ModBlocks.hadron_plating, KEY_YELLOW }); - addShapelessAuto(new ItemStack(ModBlocks.hadron_plating_striped, 1), new Object[] { ModBlocks.hadron_plating, KEY_BLACK, KEY_YELLOW }); - addShapelessAuto(new ItemStack(ModBlocks.hadron_plating_glass, 1), new Object[] { ModBlocks.hadron_plating, KEY_ANYGLASS }); - addShapelessAuto(new ItemStack(ModBlocks.hadron_plating_voltz, 1), new Object[] { ModBlocks.hadron_plating, KEY_RED }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_power, 1), new Object[] { "SFS", "FTF", "SFS", 'S', BIGMT.ingot(), 'T', ModBlocks.machine_transformer, 'F', ModItems.fuse }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_power_10m, 1), new Object[] { "HF", 'H', ModBlocks.hadron_power, 'F', ModItems.fuse }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_power_100m, 1), new Object[] { "HF", 'H', ModBlocks.hadron_power_10m, 'F', ModItems.fuse }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_power_1g, 1), new Object[] { "HF", 'H', ModBlocks.hadron_power_100m, 'F', ModItems.fuse }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_power_10g, 1), new Object[] { "HF", 'H', ModBlocks.hadron_power_1g, 'F', ModItems.fuse }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_analysis, 1), new Object[] { "IPI", "PCP", "IPI", 'I', TI.ingot(), 'P', getReflector(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED) }); - addShapelessAuto(new ItemStack(ModBlocks.hadron_analysis_glass, 1), new Object[] { ModBlocks.hadron_analysis, KEY_ANYGLASS }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_access, 1), new Object[] { "IGI", "CRC", "IPI", 'I', ModItems.plate_polymer, 'G', KEY_ANYPANE, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC), 'R', REDSTONE.block(), 'P', ModBlocks.hadron_plating_blue }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_cooler, 1, 0), new Object[] { "PCP", "CHC", "PCP", 'P', ANY_RESISTANTALLOY.plateCast(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC), 'H', Fluids.HELIUM4.getDict(16_000) }); - addRecipeAuto(new ItemStack(ModBlocks.hadron_cooler, 1, 1), new Object[] { "PCP", "CHC", "PCP", 'P', GOLD.plateCast(), 'C', ModItems.motor_bismuth, 'H', new ItemStack(ModBlocks.hadron_cooler, 1, 0) }); + //addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_gold, 1), new Object[] { "WG", "GW", 'W', ALLOY.wireDense(), 'G', GOLD.wireDense() }); + //addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_neodymium, 1), new Object[] { "WG", "GW", 'W', ND.wireDense(), 'G', GOLD.wireDense() }); + //addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_magtung, 1), new Object[] { "WW", "WW", 'W', MAGTUNG.wireDense() }); + //addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_schrabidium, 1), new Object[] { "WS", "SW", 'W', MAGTUNG.wireDense(), 'S', SA326.wireDense() }); + //addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_schrabidate, 1), new Object[] { "WS", "SW", 'W', SBD.wireDense(), 'S', SA326.wireDense() }); + //addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_starmetal, 1), new Object[] { "SW", "WS", 'W', SBD.wireDense(), 'S', STAR.wireDense() }); + //addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_chlorophyte, 1), new Object[] { "TC", "CT", 'T', CU.wireDense(), 'C', ModItems.powder_chlorophyte }); + //addRecipeAuto(new ItemStack(ModBlocks.hadron_diode, 1), new Object[] { "CIC", "ISI", "CIC", 'C', ModBlocks.hadron_coil_alloy, 'I', STEEL.ingot(), 'S', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED) }); + //addRecipeAuto(new ItemStack(ModBlocks.hadron_plating, 16), new Object[] { "CC", "CC", 'C', STEEL.plateCast()}); + //addShapelessAuto(new ItemStack(ModBlocks.hadron_plating_blue, 1), new Object[] { ModBlocks.hadron_plating, KEY_BLUE }); + //addShapelessAuto(new ItemStack(ModBlocks.hadron_plating_black, 1), new Object[] { ModBlocks.hadron_plating, KEY_BLACK }); + //addShapelessAuto(new ItemStack(ModBlocks.hadron_plating_yellow, 1), new Object[] { ModBlocks.hadron_plating, KEY_YELLOW }); + //addShapelessAuto(new ItemStack(ModBlocks.hadron_plating_striped, 1), new Object[] { ModBlocks.hadron_plating, KEY_BLACK, KEY_YELLOW }); + //addShapelessAuto(new ItemStack(ModBlocks.hadron_plating_glass, 1), new Object[] { ModBlocks.hadron_plating, KEY_ANYGLASS }); + //addShapelessAuto(new ItemStack(ModBlocks.hadron_plating_voltz, 1), new Object[] { ModBlocks.hadron_plating, KEY_RED }); + //addRecipeAuto(new ItemStack(ModBlocks.hadron_power, 1), new Object[] { "SFS", "FTF", "SFS", 'S', BIGMT.ingot(), 'T', ModBlocks.machine_transformer, 'F', ModItems.fuse }); + //addRecipeAuto(new ItemStack(ModBlocks.hadron_power_10m, 1), new Object[] { "HF", 'H', ModBlocks.hadron_power, 'F', ModItems.fuse }); + //addRecipeAuto(new ItemStack(ModBlocks.hadron_power_100m, 1), new Object[] { "HF", 'H', ModBlocks.hadron_power_10m, 'F', ModItems.fuse }); + //addRecipeAuto(new ItemStack(ModBlocks.hadron_power_1g, 1), new Object[] { "HF", 'H', ModBlocks.hadron_power_100m, 'F', ModItems.fuse }); + //addRecipeAuto(new ItemStack(ModBlocks.hadron_power_10g, 1), new Object[] { "HF", 'H', ModBlocks.hadron_power_1g, 'F', ModItems.fuse }); + //addRecipeAuto(new ItemStack(ModBlocks.hadron_analysis, 1), new Object[] { "IPI", "PCP", "IPI", 'I', TI.ingot(), 'P', getReflector(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED) }); + //addShapelessAuto(new ItemStack(ModBlocks.hadron_analysis_glass, 1), new Object[] { ModBlocks.hadron_analysis, KEY_ANYGLASS }); + //addRecipeAuto(new ItemStack(ModBlocks.hadron_access, 1), new Object[] { "IGI", "CRC", "IPI", 'I', ModItems.plate_polymer, 'G', KEY_ANYPANE, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC), 'R', REDSTONE.block(), 'P', ModBlocks.hadron_plating_blue }); + //addRecipeAuto(new ItemStack(ModBlocks.hadron_cooler, 1, 0), new Object[] { "PCP", "CHC", "PCP", 'P', ANY_RESISTANTALLOY.plateCast(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC), 'H', Fluids.HELIUM4.getDict(16_000) }); + //addRecipeAuto(new ItemStack(ModBlocks.hadron_cooler, 1, 1), new Object[] { "PCP", "CHC", "PCP", 'P', GOLD.plateCast(), 'C', ModItems.motor_bismuth, 'H', new ItemStack(ModBlocks.hadron_cooler, 1, 0) }); addRecipeAuto(new ItemStack(ModBlocks.fireworks, 1), new Object[] { "PPP", "PPP", "WIW", 'P', Items.paper, 'W', KEY_PLANKS, 'I', IRON.ingot() }); addRecipeAuto(new ItemStack(ModItems.safety_fuse, 8), new Object[] { "SSS", "SGS", "SSS", 'S', Items.string, 'G', Items.gunpowder }); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 235b7e2b4..94e2e5afa 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -882,11 +882,11 @@ public class MainRegistry { MinecraftForge.EVENT_BUS.register(new SchistStratum()); //DecorateBiomeEvent.Pre //MinecraftForge.EVENT_BUS.register(new DeepLayer()); //DecorateBiomeEvent.Pre - new OreCave(ModBlocks.stone_resource, 0).setThreshold(1.5D).setRangeMult(20).setYLevel(30).setMaxRange(20).withFluid(ModBlocks.sulfuric_acid_block); //sulfur - new OreCave(ModBlocks.stone_resource, 1).setThreshold(1.75D).setRangeMult(20).setYLevel(25).setMaxRange(20); //asbestos - new OreLayer3D(ModBlocks.stone_resource, EnumStoneType.HEMATITE.ordinal()).setScaleH(0.04D).setScaleV(0.25D).setThreshold(230); - new OreLayer3D(ModBlocks.stone_resource, EnumStoneType.BAUXITE.ordinal()).setScaleH(0.03D).setScaleV(0.15D).setThreshold(300); - new OreLayer3D(ModBlocks.stone_resource, EnumStoneType.MALACHITE.ordinal()).setScaleH(0.1D).setScaleV(0.15D).setThreshold(275); + if(WorldConfig.enableSulfurCave) new OreCave(ModBlocks.stone_resource, 0).setThreshold(1.5D).setRangeMult(20).setYLevel(30).setMaxRange(20).withFluid(ModBlocks.sulfuric_acid_block); //sulfur + if(WorldConfig.enableAsbestosCave) new OreCave(ModBlocks.stone_resource, 1).setThreshold(1.75D).setRangeMult(20).setYLevel(25).setMaxRange(20); //asbestos + if(WorldConfig.enableHematite) new OreLayer3D(ModBlocks.stone_resource, EnumStoneType.HEMATITE.ordinal()).setScaleH(0.04D).setScaleV(0.25D).setThreshold(230); + if(WorldConfig.enableMalachite) new OreLayer3D(ModBlocks.stone_resource, EnumStoneType.BAUXITE.ordinal()).setScaleH(0.03D).setScaleV(0.15D).setThreshold(300); + if(WorldConfig.enableBauxite) new OreLayer3D(ModBlocks.stone_resource, EnumStoneType.MALACHITE.ordinal()).setScaleH(0.1D).setScaleV(0.15D).setThreshold(275); //new BiomeCave().setThreshold(1.5D).setRangeMult(20).setYLevel(40).setMaxRange(20); //new OreLayer(Blocks.coal_ore, 0.2F).setThreshold(4).setRangeMult(3).setYLevel(70); BedrockOre.init(); diff --git a/src/main/java/com/hbm/uninos/GenNode.java b/src/main/java/com/hbm/uninos/GenNode.java index 6f7390019..cc7f028c3 100644 --- a/src/main/java/com/hbm/uninos/GenNode.java +++ b/src/main/java/com/hbm/uninos/GenNode.java @@ -7,7 +7,7 @@ public class GenNode { public BlockPos[] positions; public DirPos[] connections; - public INodeNet net; + public NodeNet net; public boolean expired = false; public boolean recentlyChanged = true; public T networkProvider; @@ -34,7 +34,7 @@ public class GenNode { return this.net != null && this.net.isValid(); } - public void setNet(INodeNet net) { + public void setNet(NodeNet net) { this.net = net; this.recentlyChanged = true; } diff --git a/src/main/java/com/hbm/uninos/IGenProvider.java b/src/main/java/com/hbm/uninos/IGenProvider.java new file mode 100644 index 000000000..efc43f763 --- /dev/null +++ b/src/main/java/com/hbm/uninos/IGenProvider.java @@ -0,0 +1,5 @@ +package com.hbm.uninos; + +public interface IGenProvider { + +} diff --git a/src/main/java/com/hbm/uninos/IGenReceiver.java b/src/main/java/com/hbm/uninos/IGenReceiver.java new file mode 100644 index 000000000..3f6ef53ca --- /dev/null +++ b/src/main/java/com/hbm/uninos/IGenReceiver.java @@ -0,0 +1,10 @@ +package com.hbm.uninos; + +import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; + +public interface IGenReceiver { + + public default ConnectionPriority getPriority() { + return ConnectionPriority.NORMAL; + } +} diff --git a/src/main/java/com/hbm/uninos/INetworkProvider.java b/src/main/java/com/hbm/uninos/INetworkProvider.java index ec515d92b..a774028ab 100644 --- a/src/main/java/com/hbm/uninos/INetworkProvider.java +++ b/src/main/java/com/hbm/uninos/INetworkProvider.java @@ -4,7 +4,7 @@ package com.hbm.uninos; * Each instance of a network provider is a valid "type" of node in UNINOS * @author hbm */ -public interface INetworkProvider { +public interface INetworkProvider { - public INodeNet provideNetwork(); + public T provideNetwork(); } diff --git a/src/main/java/com/hbm/uninos/INodeNet.java b/src/main/java/com/hbm/uninos/INodeNet.java deleted file mode 100644 index b7c84d3ae..000000000 --- a/src/main/java/com/hbm/uninos/INodeNet.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.hbm.uninos; - -public interface INodeNet { - - public boolean isValid(); - public void destroy(); -} diff --git a/src/main/java/com/hbm/uninos/NodeNet.java b/src/main/java/com/hbm/uninos/NodeNet.java new file mode 100644 index 000000000..650d902bd --- /dev/null +++ b/src/main/java/com/hbm/uninos/NodeNet.java @@ -0,0 +1,80 @@ +package com.hbm.uninos; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Random; +import java.util.Set; + +public abstract class NodeNet { + + public static Random rand = new Random(); + + public boolean valid = true; + public Set> links = new HashSet(); + + public abstract HashMap, Long> receiverEntries(); + public abstract HashMap, Long> providerEntries(); + + public NodeNet() { + UniNodespace.activeNodeNets.add(this); + } + + /// SUBSCRIBER HANDLING /// + public boolean isSubscribed(IGenReceiver receiver) { return this.receiverEntries().containsKey(receiver); } + public void addReceiver(IGenReceiver receiver) { this.receiverEntries().put(receiver, System.currentTimeMillis()); } + public void removeReceiver(IGenReceiver receiver) { this.receiverEntries().remove(receiver); } + + /// PROVIDER HANDLING /// + public boolean isProvider(IGenProvider provider) { return this.providerEntries().containsKey(provider); } + public void addProvider(IGenProvider provider) { this.providerEntries().put(provider, System.currentTimeMillis()); } + public void removeProvider(IGenProvider provider) { this.providerEntries().remove(provider); } + + /** Combines two networks into one */ + public void joinNetworks(NodeNet network) { + if(network == this) return; + + List> oldNodes = new ArrayList(network.links.size()); + oldNodes.addAll(network.links); + + for(GenNode conductor : oldNodes) forceJoinLink(conductor); + network.links.clear(); + + for(IGenReceiver connector : network.receiverEntries().keySet()) this.addReceiver(connector); + for(IGenProvider connector : network.providerEntries().keySet()) this.addProvider(connector); + network.destroy(); + } + + /** Adds the node as part of this network's links */ + public NodeNet joinLink(GenNode node) { + if(node.net != null) node.net.leaveLink(node); + return forceJoinLink(node); + } + + /** Adds the node as part of this network's links, skips the part about removing it from existing networks */ + public NodeNet forceJoinLink(GenNode node) { + this.links.add(node); + node.setNet(this); + return this; + } + + /** Removes the specified node */ + public void leaveLink(GenNode node) { + node.setNet(null); + this.links.remove(node); + } + + /// GENERAL POWER NET CONTROL /// + public void invalidate() { this.valid = false; UniNodespace.activeNodeNets.remove(this); } + public boolean isValid() { return this.valid; } + public abstract void update(); + + public void destroy() { + this.invalidate(); + for(GenNode link : this.links) if(link.net == this) link.setNet(null); + this.links.clear(); + this.receiverEntries().clear(); + this.providerEntries().clear(); + } +} diff --git a/src/main/java/com/hbm/uninos/UniNodespace.java b/src/main/java/com/hbm/uninos/UniNodespace.java index 7b07da5de..f0e9e7ffd 100644 --- a/src/main/java/com/hbm/uninos/UniNodespace.java +++ b/src/main/java/com/hbm/uninos/UniNodespace.java @@ -1,6 +1,8 @@ package com.hbm.uninos; import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; import com.hbm.util.Tuple.Pair; import com.hbm.util.fauxpointtwelve.BlockPos; @@ -10,6 +12,7 @@ import net.minecraft.world.World; public class UniNodespace { public static HashMap worlds = new HashMap(); + public static Set activeNodeNets = new HashSet<>(); public static GenNode getNode(World world, int x, int y, int z, INetworkProvider type) { UniNodeWorld nodeWorld = worlds.get(world); diff --git a/src/main/java/com/hbm/uninos/networkproviders/PowerProvider.java b/src/main/java/com/hbm/uninos/networkproviders/PowerProvider.java index bcaccc994..86cf18403 100644 --- a/src/main/java/com/hbm/uninos/networkproviders/PowerProvider.java +++ b/src/main/java/com/hbm/uninos/networkproviders/PowerProvider.java @@ -1,13 +1,12 @@ package com.hbm.uninos.networkproviders; import com.hbm.uninos.INetworkProvider; -import com.hbm.uninos.INodeNet; import com.hbm.uninos.networks.PowerNetwork; -public class PowerProvider implements INetworkProvider { +public class PowerProvider implements INetworkProvider { @Override - public INodeNet provideNetwork() { + public PowerNetwork provideNetwork() { return new PowerNetwork(); } } diff --git a/src/main/java/com/hbm/uninos/networks/PowerNetwork.java b/src/main/java/com/hbm/uninos/networks/PowerNetwork.java index 45bb09976..76897c4fc 100644 --- a/src/main/java/com/hbm/uninos/networks/PowerNetwork.java +++ b/src/main/java/com/hbm/uninos/networks/PowerNetwork.java @@ -1,16 +1,117 @@ package com.hbm.uninos.networks; -import com.hbm.uninos.INodeNet; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map.Entry; -public class PowerNetwork implements INodeNet { +import com.hbm.uninos.IGenProvider; +import com.hbm.uninos.IGenReceiver; +import com.hbm.uninos.NodeNet; +import com.hbm.uninos.networkproviders.PowerProvider; +import com.hbm.util.Tuple.Pair; - @Override - public boolean isValid() { - return false; +import api.hbm.energymk2.IEnergyProviderMK2; +import api.hbm.energymk2.IEnergyReceiverMK2; +import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; + +public class PowerNetwork extends NodeNet { + + public HashMap receiverEntries = new HashMap(); + public HashMap providerEntries = new HashMap(); + + public long energyTracker = 0L; + + public void resetEnergyTracker() { + this.energyTracker = 0; } - @Override - public void destroy() { + @Override // this was all fun and games but let's take a few steps back: this generics stuff is kinda breaking shit, and as it turns out, apparently nothing even uses the type + public HashMap, Long> receiverEntries() { + return null; + } + + @Override // therefore i should probably consider scrapping the majority of the generic types - they seem to be kinda useless with the current approach + public HashMap, Long> providerEntries() { + return null; + } + + protected static int timeout = 3_000; + + public void update() { + if(providerEntries.isEmpty()) return; + if(receiverEntries.isEmpty()) return; + + long timestamp = System.currentTimeMillis(); + + List> providers = new ArrayList(); + long powerAvailable = 0; + + Iterator> provIt = providerEntries.entrySet().iterator(); + while(provIt.hasNext()) { + Entry entry = provIt.next(); + if(timestamp - entry.getValue() > timeout) { provIt.remove(); continue; } + long src = Math.min(entry.getKey().getPower(), entry.getKey().getProviderSpeed()); + providers.add(new Pair(entry.getKey(), src)); + powerAvailable += src; + } + + List>[] receivers = new ArrayList[ConnectionPriority.values().length]; + for(int i = 0; i < receivers.length; i++) receivers[i] = new ArrayList(); + long[] demand = new long[ConnectionPriority.values().length]; + long totalDemand = 0; + + Iterator> recIt = receiverEntries.entrySet().iterator(); + + while(recIt.hasNext()) { + Entry entry = recIt.next(); + if(timestamp - entry.getValue() > timeout) { recIt.remove(); continue; } + long rec = Math.min(entry.getKey().getMaxPower() - entry.getKey().getPower(), entry.getKey().getReceiverSpeed()); + int p = entry.getKey().getPriority().ordinal(); + receivers[p].add(new Pair(entry.getKey(), rec)); + demand[p] += rec; + totalDemand += rec; + } + + long toTransfer = Math.min(powerAvailable, totalDemand); + long energyUsed = 0; + + for(int i = ConnectionPriority.values().length - 1; i >= 0; i--) { + List> list = receivers[i]; + long priorityDemand = demand[i]; + + for(Pair entry : list) { + double weight = (double) entry.getValue() / (double) (priorityDemand); + long toSend = (long) Math.max(toTransfer * weight, 0D); + energyUsed += (toSend - entry.getKey().transferPower(toSend)); //leftovers are subtracted from the intended amount to use up + } + + toTransfer -= energyUsed; + } + + this.energyTracker += energyUsed; + long leftover = energyUsed; + + for(Pair entry : providers) { + double weight = (double) entry.getValue() / (double) powerAvailable; + long toUse = (long) Math.max(energyUsed * weight, 0D); + entry.getKey().usePower(toUse); + leftover -= toUse; + } + + //rounding error compensation, detects surplus that hasn't been used and removes it from random providers + int iterationsLeft = 100; // whiles without emergency brakes are a bad idea + while(iterationsLeft > 0 && leftover > 0 && providers.size() > 0) { + iterationsLeft--; + + Pair selected = providers.get(rand.nextInt(providers.size())); + IEnergyProviderMK2 scapegoat = selected.getKey(); + + long toUse = Math.min(leftover, scapegoat.getPower()); + scapegoat.usePower(toUse); + leftover -= toUse; + } } } diff --git a/src/main/resources/assets/hbm/textures/items/ingot_metal_sheet.png b/src/main/resources/assets/hbm/textures/items/ingot_metal_sheet.png new file mode 100644 index 000000000..94d7d4a40 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/ingot_metal_sheet.png differ