From 609e6e24a614fa71d57e5cd29203747846021086 Mon Sep 17 00:00:00 2001 From: ticticboooom Date: Thu, 2 Dec 2021 12:24:10 +0000 Subject: [PATCH] started 1.18 rewrite --- .github/ISSUE_TEMPLATE/bug_report.md | 40 -- .github/workflows/gradle.yml | 27 - LICENSE.txt | 520 ------------------ README.md | 13 - build.gradle | 221 ++------ .../controllers/basic.json | 96 ---- .../masterful_machinery/controllers/mid.json | 106 ---- gradle.properties | 5 +- gradle/wrapper/gradle-wrapper.jar | Bin 59203 -> 59536 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 269 +++++---- settings.gradle | 1 - .../java/com/ticticboooom/mods/mm/MM.java | 155 ------ .../mods/mm/block/ControllerBlock.java | 86 --- .../mods/mm/block/MachinePortBlock.java | 110 ---- .../mods/mm/block/ProjectorBlock.java | 164 ------ .../mm/block/RotationMachinePortBlock.java | 36 -- .../mods/mm/block/StructureGenBlock.java | 175 ------ .../container/ControllerBlockContainer.java | 53 -- .../block/container/PortBlockContainer.java | 70 --- .../container/ProjectorBlockContainer.java | 26 - .../container/StructureGenBlockContainer.java | 72 --- .../container/slot/StructureDeviceSlot.java | 17 - .../AstralMachineInputPortBlockEntity.java | 94 ---- .../tile/AstralMachinePortBlockEntity.java | 140 ----- .../mm/block/tile/ControllerBlockEntity.java | 130 ----- .../mods/mm/block/tile/IMachinePortTile.java | 9 - .../mm/block/tile/MachinePortBlockEntity.java | 84 --- .../tile/ManaMachinePortBlockEntity.java | 101 ---- .../mm/block/tile/ProjectorBlockEntity.java | 10 - .../RotationGenMachinePortBlockEntity.java | 106 ---- .../tile/RotationMachinePortBlockEntity.java | 83 --- .../block/tile/StructureGenBlockEntity.java | 64 --- .../mods/mm/block/tile/UpdatableTile.java | 21 - .../mods/mm/client/MMRenderTypes.java | 31 -- .../mods/mm/client/jei/MMJeiPlugin.java | 105 ---- .../MachineProcessRecipeCategory.java | 153 ------ .../MachineStructureRecipeCategory.java | 339 ------------ .../jei/category/render/AirBlockReader.java | 38 -- .../as/StarlightIngredientHelper.java | 46 -- .../as/StarlightIngredientRenderer.java | 39 -- .../as/StarlightIngredientType.java | 12 - .../energy/EnergyIngredientHelper.java | 44 -- .../energy/EnergyIngredientRenderer.java | 39 -- .../energy/EnergyIngredientType.java | 11 - .../mana/ManaIngredientHelper.java | 46 -- .../mana/ManaIngredientRenderer.java | 39 -- .../ingredients/mana/ManaIngredientType.java | 11 - .../jei/ingredients/model/EnergyStack.java | 15 - .../jei/ingredients/model/PressureStack.java | 15 - .../jei/ingredients/model/RotationStack.java | 15 - .../jei/ingredients/model/StarlightStack.java | 15 - .../pressure/PNCPressureIngredientHelper.java | 48 -- .../PNCPressureIngredientRenderer.java | 39 -- .../pressure/PNCPressureIngredientType.java | 11 - .../rotation/RotationIngredientHelper.java | 46 -- .../rotation/RotationIngredientRenderer.java | 48 -- .../rotation/RotationIngredientType.java | 12 - .../ControllerBlockContainerScreen.java | 46 -- .../screen/PortBlockContainerScreen.java | 40 -- .../StructureGenBlockContainerScreen.java | 58 -- .../ter/StructureGenTileEntityRenderer.java | 112 ---- .../mods/mm/client/util/FluidRenderer.java | 129 ----- .../mm/client/util/GuiBlockRenderBuilder.java | 146 ----- .../mm/core/mixin/ResourceLoaderMixin.java | 50 -- .../mods/mm/data/MachineProcessRecipe.java | 382 ------------- .../mods/mm/data/MachineStructureRecipe.java | 384 ------------- .../structure/MachineStructureBlockPos.java | 49 -- .../structure/MachineStructureObject.java | 18 - .../model/structure/MachineStructurePort.java | 31 -- .../MachineStructureRecipeKeyModel.java | 27 - .../MachineStructureRecipeLegendModel.java | 26 - .../data/model/structure/MockedNamedTag.java | 36 -- .../mods/mm/datagen/DataGeneratorFactory.java | 44 -- .../mods/mm/datagen/InMemoryPack.java | 126 ----- .../mods/mm/datagen/MMPackFinder.java | 55 -- .../mods/mm/datagen/MockedNamedTag.java | 30 - .../mods/mm/datagen/PackType.java | 17 - .../gen/runtime/BaseLootTableProvider.java | 141 ----- .../gen/runtime/MMBlockStateProvider.java | 149 ----- .../gen/runtime/MMItemModelProvider.java | 43 -- .../datagen/gen/runtime/MMLangProvider.java | 48 -- .../gen/runtime/MMLootTableProvider.java | 36 -- .../mods/mm/event/ConstructEventHandler.java | 14 - .../InvalidProcessDefinitionException.java | 7 - .../InvalidStructureDefinitionException.java | 7 - .../mods/mm/helper/GLScissor.java | 39 -- .../mods/mm/helper/GuiHelper.java | 13 - .../ticticboooom/mods/mm/helper/IOHelper.java | 22 - .../mods/mm/helper/InvHelper.java | 11 - .../mods/mm/helper/NBTHelper.java | 22 - .../ticticboooom/mods/mm/helper/RLUtils.java | 13 - .../mods/mm/helper/StructureHelper.java | 128 ----- .../mods/mm/inventory/ItemStackInventory.java | 63 --- .../mm/inventory/PortEnergyInventory.java | 77 --- .../mods/mm/inventory/PortFluidInventory.java | 105 ---- .../mm/inventory/as/IStarlightStorage.java | 47 -- .../as/MMIndependentStarlightSource.java | 96 ---- .../as/MMSimpleTransmissionReceiver.java | 57 -- .../inventory/as/PortStarlightInventory.java | 74 --- .../mm/inventory/botania/IManaStorage.java | 47 -- .../inventory/botania/PortManaInventory.java | 74 --- .../inventory/mek/MekChemicalInventory.java | 156 ------ .../mek/MekanismContentsListener.java | 10 - .../mm/inventory/mek/PortMekGasInventory.java | 12 - .../inventory/mek/PortMekInfuseInventory.java | 12 - .../inventory/mek/PortMekSlurryInventory.java | 12 - .../mm/item/StructureGenSelectionDevice.java | 48 -- .../mods/mm/model/JEIIngredientWrapper.java | 20 - .../mods/mm/model/ModelOverrideModel.java | 22 - .../mods/mm/model/ProcessUpdate.java | 19 - .../mods/mm/nbt/NBTActionParser.java | 60 -- .../ticticboooom/mods/mm/nbt/NBTPopulate.java | 25 - .../ticticboooom/mods/mm/nbt/NBTUtils.java | 56 -- .../mods/mm/nbt/NBTValidator.java | 38 -- .../mods/mm/nbt/model/NBTActionModel.java | 14 - .../mods/mm/nbt/model/NBTModel.java | 12 - .../mods/mm/network/PacketHandler.java | 22 - .../packets/TileClientUpdatePacket.java | 45 -- .../mods/mm/ports/MasterfulPortType.java | 39 -- .../mm/ports/parser/EnergyPortParser.java | 67 --- .../mods/mm/ports/parser/FluidPortParser.java | 68 --- .../mods/mm/ports/parser/ItemPortParser.java | 83 --- .../mods/mm/ports/parser/ManaPortParser.java | 75 --- .../mm/ports/parser/MekGasPortParser.java | 69 --- .../mm/ports/parser/MekInfusePortParser.java | 72 --- .../mm/ports/parser/MekSlurryPortParser.java | 69 --- .../mm/ports/parser/PneumaticPortParser.java | 68 --- .../mods/mm/ports/parser/PortFactory.java | 61 -- .../mm/ports/parser/RotationPortParser.java | 86 --- .../mm/ports/parser/StarlightPortParser.java | 79 --- .../mm/ports/parser/WeatherPortParser.java | 79 --- .../mods/mm/ports/state/EnergyPortState.java | 123 ----- .../mods/mm/ports/state/FluidPortState.java | 170 ------ .../mods/mm/ports/state/ItemPortState.java | 277 ---------- .../mods/mm/ports/state/ManaPortState.java | 124 ----- .../mods/mm/ports/state/MekGasPortState.java | 158 ------ .../mm/ports/state/MekInfusePortState.java | 160 ------ .../mm/ports/state/MekSlurryPortState.java | 160 ------ .../mm/ports/state/PneumaticPortState.java | 102 ---- .../mods/mm/ports/state/PortState.java | 48 -- .../mm/ports/state/RotationPortState.java | 94 ---- .../mm/ports/state/StarlightPortState.java | 118 ---- .../mods/mm/ports/state/WeatherPortState.java | 69 --- .../mm/ports/storage/EnergyPortStorage.java | 73 --- .../mm/ports/storage/FluidPortStorage.java | 86 --- .../mm/ports/storage/ItemPortStorage.java | 98 ---- .../mm/ports/storage/ManaPortStorage.java | 84 --- .../mm/ports/storage/MekGasPortStorage.java | 82 --- .../ports/storage/MekInfusePortStorage.java | 84 --- .../ports/storage/MekSlurryPortStorage.java | 88 --- .../ports/storage/PneumaticPortStorage.java | 111 ---- .../mods/mm/ports/storage/PortStorage.java | 53 -- .../mm/ports/storage/RotationPortStorage.java | 89 --- .../ports/storage/StarlightPortStorage.java | 69 --- .../mm/ports/storage/WeatherPortStorage.java | 61 -- .../mods/mm/registration/MMLoader.java | 159 ------ .../mods/mm/registration/MMPorts.java | 38 -- .../mods/mm/registration/MMSetup.java | 41 -- .../mods/mm/registration/RecipeTypes.java | 20 - .../mods/mm/registration/Registerable.java | 16 - .../mods/masterfulmachinery/ModRoot.java | 7 + .../mods/masterfulmachinery/Ref.java | 14 + .../block/MasterfulPortBlock.java | 11 + .../entity/MasterfulPortBlockEntity.java | 13 + .../ports/base/MasterfulPortType.java | 24 + .../ports/types/ItemsPortType.java | 7 + .../registry/Registries.java | 23 + src/main/resources/META-INF/mods.toml | 8 +- .../models/block/projector.json | 332 ----------- .../models/block/structure_generator.json | 351 ------------ .../textures/block/base_block.png | Bin 39879 -> 0 bytes .../block/base_ports/energy_input_cutout.png | Bin 34242 -> 0 bytes .../block/base_ports/energy_output_cutout.png | Bin 34186 -> 0 bytes .../block/base_ports/fluid_input_cutout.png | Bin 34152 -> 0 bytes .../block/base_ports/fluid_output_cutout.png | Bin 34154 -> 0 bytes .../block/base_ports/item_input_cutout.png | Bin 34113 -> 0 bytes .../block/base_ports/item_output_cutout.png | Bin 34122 -> 0 bytes .../textures/block/circuit_cutout.png | Bin 39946 -> 0 bytes .../astral_starlight_input_cutout.png | Bin 5506 -> 0 bytes .../astral_starlight_output_cutout.png | Bin 5462 -> 0 bytes .../botania_mana_input_cutout.png | Bin 5408 -> 0 bytes .../botania_mana_output_cutout.png | Bin 5408 -> 0 bytes .../create_rotation_input_cutout.png | Bin 5378 -> 0 bytes .../create_rotation_output_cutout.png | Bin 5345 -> 0 bytes .../mekanism_gas_input_cutout.png | Bin 5288 -> 0 bytes .../mekanism_gas_output_cutout.png | Bin 5289 -> 0 bytes .../mekanism_heat_input_cutout.png | Bin 5299 -> 0 bytes .../mekanism_heat_output_cutout.png | Bin 5297 -> 0 bytes .../mekanism_infusion_input_cutout.png | Bin 5267 -> 0 bytes .../mekanism_infusion_output_cutout.png | Bin 5268 -> 0 bytes .../mekanism_laser_input_cutout.png | Bin 5267 -> 0 bytes .../mekanism_laser_output_cutout.png | Bin 5314 -> 0 bytes .../mekanism_pigment_input_cutout.png | Bin 5290 -> 0 bytes .../mekanism_pigment_output_cutout.png | Bin 5291 -> 0 bytes .../mekanism_slurry_input_cutout.png | Bin 5318 -> 0 bytes .../mekanism_slurry_output_cutout.png | Bin 5316 -> 0 bytes .../pncr_pressure_input_cutout.png | Bin 5304 -> 0 bytes .../pncr_pressure_output_cutout.png | Bin 5301 -> 0 bytes .../textures/block/config_generator_base.png | Bin 701 -> 0 bytes .../block/config_generator_monitor.png | Bin 711 -> 0 bytes .../textures/block/controller_cutout.png | Bin 39908 -> 0 bytes .../textures/block/gearbox_cutout.png | Bin 39883 -> 0 bytes .../textures/block/projector.png | Bin 693 -> 0 bytes .../textures/block/vent_cutout.png | Bin 39732 -> 0 bytes .../textures/gui/gui_large.png | Bin 13161 -> 0 bytes .../textures/gui/gui_large_gen.afdesign | Bin 60200 -> 0 bytes .../textures/gui/gui_large_gen.png | Bin 14992 -> 0 bytes .../textures/gui/gui_large_jei.png | Bin 17040 -> 0 bytes .../textures/gui/mana_gui.png | Bin 3984 -> 0 bytes .../textures/gui/port_gui.png | Bin 3221 -> 0 bytes .../textures/gui/slot_parts.png | Bin 3717 -> 0 bytes .../textures/item/blueprint.png | Bin 39974 -> 0 bytes .../textures/item/scanning_tool.png | Bin 39973 -> 0 bytes .../resources/masterfulmachinery.mixins.json | 14 - src/main/resources/pack.mcmeta | 5 +- .../com/ticticboooom/mods/mmtest/MMTest.java | 11 - .../java/masterfulmachinery_test/ModRoot.java | 7 + src/test/resources/META-INF/mods.toml | 67 ++- src/test/resources/data/mm/recipes/genny.json | 22 - .../mm/recipes/structures/render_test.json | 19 - .../data/mm/recipes/structures/test_all.json | 82 --- .../data/mm/recipes/structures/test_fe.json | 19 - .../mm/recipes/structures/test_fluid.json | 19 - .../data/mm/recipes/structures/test_gas.json | 19 - .../mm/recipes/structures/test_infuse.json | 19 - .../mm/recipes/structures/test_items.json | 19 - .../data/mm/recipes/structures/test_mana.json | 19 - .../mm/recipes/structures/test_model.json | 19 - .../mm/recipes/structures/test_pressure.json | 19 - .../mm/recipes/structures/test_rotation.json | 19 - .../mm/recipes/structures/test_slurry.json | 19 - .../mm/recipes/structures/test_starlight.json | 19 - .../structures/test_structure_tags.json | 22 - .../recipes/structures/test_tiered_fluid.json | 33 -- .../recipes/structures/test_variable_ios.json | 52 -- .../resources/data/mm/recipes/test_fe.json | 22 - .../resources/data/mm/recipes/test_fluid.json | 24 - .../resources/data/mm/recipes/test_gas.json | 24 - .../data/mm/recipes/test_infuse.json | 24 - .../resources/data/mm/recipes/test_items.json | 24 - .../data/mm/recipes/test_items_tag.json | 24 - .../resources/data/mm/recipes/test_mana.json | 22 - .../data/mm/recipes/test_pressure.json | 22 - .../data/mm/recipes/test_rotation.json | 24 - .../data/mm/recipes/test_slurry.json | 24 - .../data/mm/recipes/test_starlight.json | 22 - .../data/mm/recipes/test_tiered_fluid.json | 24 - src/test/resources/pack.mcmeta | 5 +- version.properties | 2 - 250 files changed, 385 insertions(+), 13050 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 .github/workflows/gradle.yml delete mode 100644 LICENSE.txt delete mode 100644 README.md delete mode 100644 demo_config/config/masterful_machinery/controllers/basic.json delete mode 100644 demo_config/config/masterful_machinery/controllers/mid.json delete mode 100644 settings.gradle delete mode 100644 src/main/java/com/ticticboooom/mods/mm/MM.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/block/ControllerBlock.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/block/MachinePortBlock.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/block/ProjectorBlock.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/block/RotationMachinePortBlock.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/block/StructureGenBlock.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/block/container/ControllerBlockContainer.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/block/container/PortBlockContainer.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/block/container/ProjectorBlockContainer.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/block/container/StructureGenBlockContainer.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/block/container/slot/StructureDeviceSlot.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/block/tile/AstralMachineInputPortBlockEntity.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/block/tile/AstralMachinePortBlockEntity.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/block/tile/ControllerBlockEntity.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/block/tile/IMachinePortTile.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/block/tile/MachinePortBlockEntity.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/block/tile/ManaMachinePortBlockEntity.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/block/tile/ProjectorBlockEntity.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/block/tile/RotationGenMachinePortBlockEntity.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/block/tile/RotationMachinePortBlockEntity.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/block/tile/StructureGenBlockEntity.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/block/tile/UpdatableTile.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/MMRenderTypes.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/MMJeiPlugin.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/category/MachineProcessRecipeCategory.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/category/MachineStructureRecipeCategory.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/category/render/AirBlockReader.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/as/StarlightIngredientHelper.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/as/StarlightIngredientRenderer.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/as/StarlightIngredientType.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/energy/EnergyIngredientHelper.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/energy/EnergyIngredientRenderer.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/energy/EnergyIngredientType.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/mana/ManaIngredientHelper.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/mana/ManaIngredientRenderer.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/mana/ManaIngredientType.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/model/EnergyStack.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/model/PressureStack.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/model/RotationStack.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/model/StarlightStack.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/pressure/PNCPressureIngredientHelper.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/pressure/PNCPressureIngredientRenderer.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/pressure/PNCPressureIngredientType.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/rotation/RotationIngredientHelper.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/rotation/RotationIngredientRenderer.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/rotation/RotationIngredientType.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/screen/ControllerBlockContainerScreen.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/screen/PortBlockContainerScreen.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/screen/StructureGenBlockContainerScreen.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/ter/StructureGenTileEntityRenderer.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/util/FluidRenderer.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/client/util/GuiBlockRenderBuilder.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/core/mixin/ResourceLoaderMixin.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/data/MachineProcessRecipe.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/data/MachineStructureRecipe.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/data/model/structure/MachineStructureBlockPos.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/data/model/structure/MachineStructureObject.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/data/model/structure/MachineStructurePort.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/data/model/structure/MachineStructureRecipeKeyModel.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/data/model/structure/MachineStructureRecipeLegendModel.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/data/model/structure/MockedNamedTag.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/datagen/DataGeneratorFactory.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/datagen/InMemoryPack.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/datagen/MMPackFinder.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/datagen/MockedNamedTag.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/datagen/PackType.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/datagen/gen/runtime/BaseLootTableProvider.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/datagen/gen/runtime/MMBlockStateProvider.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/datagen/gen/runtime/MMItemModelProvider.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/datagen/gen/runtime/MMLangProvider.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/datagen/gen/runtime/MMLootTableProvider.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/event/ConstructEventHandler.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/exception/InvalidProcessDefinitionException.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/exception/InvalidStructureDefinitionException.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/helper/GLScissor.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/helper/GuiHelper.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/helper/IOHelper.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/helper/InvHelper.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/helper/NBTHelper.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/helper/RLUtils.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/helper/StructureHelper.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/inventory/ItemStackInventory.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/inventory/PortEnergyInventory.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/inventory/PortFluidInventory.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/inventory/as/IStarlightStorage.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/inventory/as/MMIndependentStarlightSource.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/inventory/as/MMSimpleTransmissionReceiver.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/inventory/as/PortStarlightInventory.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/inventory/botania/IManaStorage.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/inventory/botania/PortManaInventory.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/inventory/mek/MekChemicalInventory.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/inventory/mek/MekanismContentsListener.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/inventory/mek/PortMekGasInventory.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/inventory/mek/PortMekInfuseInventory.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/inventory/mek/PortMekSlurryInventory.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/item/StructureGenSelectionDevice.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/model/JEIIngredientWrapper.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/model/ModelOverrideModel.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/model/ProcessUpdate.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/nbt/NBTActionParser.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/nbt/NBTPopulate.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/nbt/NBTUtils.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/nbt/NBTValidator.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/nbt/model/NBTActionModel.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/nbt/model/NBTModel.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/network/PacketHandler.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/network/packets/TileClientUpdatePacket.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/MasterfulPortType.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/parser/EnergyPortParser.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/parser/FluidPortParser.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/parser/ItemPortParser.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/parser/ManaPortParser.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/parser/MekGasPortParser.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/parser/MekInfusePortParser.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/parser/MekSlurryPortParser.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/parser/PneumaticPortParser.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/parser/PortFactory.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/parser/RotationPortParser.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/parser/StarlightPortParser.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/parser/WeatherPortParser.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/state/EnergyPortState.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/state/FluidPortState.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/state/ItemPortState.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/state/ManaPortState.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/state/MekGasPortState.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/state/MekInfusePortState.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/state/MekSlurryPortState.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/state/PneumaticPortState.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/state/PortState.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/state/RotationPortState.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/state/StarlightPortState.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/state/WeatherPortState.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/storage/EnergyPortStorage.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/storage/FluidPortStorage.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/storage/ItemPortStorage.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/storage/ManaPortStorage.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/storage/MekGasPortStorage.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/storage/MekInfusePortStorage.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/storage/MekSlurryPortStorage.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/storage/PneumaticPortStorage.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/storage/PortStorage.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/storage/RotationPortStorage.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/storage/StarlightPortStorage.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/ports/storage/WeatherPortStorage.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/registration/MMLoader.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/registration/MMPorts.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/registration/MMSetup.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/registration/RecipeTypes.java delete mode 100644 src/main/java/com/ticticboooom/mods/mm/registration/Registerable.java create mode 100644 src/main/java/live/ticticboooom/mods/masterfulmachinery/ModRoot.java create mode 100644 src/main/java/live/ticticboooom/mods/masterfulmachinery/Ref.java create mode 100644 src/main/java/live/ticticboooom/mods/masterfulmachinery/block/MasterfulPortBlock.java create mode 100644 src/main/java/live/ticticboooom/mods/masterfulmachinery/block/entity/MasterfulPortBlockEntity.java create mode 100644 src/main/java/live/ticticboooom/mods/masterfulmachinery/ports/base/MasterfulPortType.java create mode 100644 src/main/java/live/ticticboooom/mods/masterfulmachinery/ports/types/ItemsPortType.java create mode 100644 src/main/java/live/ticticboooom/mods/masterfulmachinery/registry/Registries.java delete mode 100644 src/main/resources/assets/masterfulmachinery/models/block/projector.json delete mode 100644 src/main/resources/assets/masterfulmachinery/models/block/structure_generator.json delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/base_block.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/base_ports/energy_input_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/base_ports/energy_output_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/base_ports/fluid_input_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/base_ports/fluid_output_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/base_ports/item_input_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/base_ports/item_output_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/circuit_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/astral_starlight_input_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/astral_starlight_output_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/botania_mana_input_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/botania_mana_output_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/create_rotation_input_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/create_rotation_output_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_gas_input_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_gas_output_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_heat_input_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_heat_output_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_infusion_input_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_infusion_output_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_laser_input_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_laser_output_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_pigment_input_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_pigment_output_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_slurry_input_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_slurry_output_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/pncr_pressure_input_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/pncr_pressure_output_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/config_generator_base.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/config_generator_monitor.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/controller_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/gearbox_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/projector.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/block/vent_cutout.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/gui/gui_large.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/gui/gui_large_gen.afdesign delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/gui/gui_large_gen.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/gui/gui_large_jei.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/gui/mana_gui.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/gui/port_gui.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/gui/slot_parts.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/item/blueprint.png delete mode 100644 src/main/resources/assets/masterfulmachinery/textures/item/scanning_tool.png delete mode 100644 src/main/resources/masterfulmachinery.mixins.json delete mode 100644 src/test/java/com/ticticboooom/mods/mmtest/MMTest.java create mode 100644 src/test/java/masterfulmachinery_test/ModRoot.java delete mode 100644 src/test/resources/data/mm/recipes/genny.json delete mode 100644 src/test/resources/data/mm/recipes/structures/render_test.json delete mode 100644 src/test/resources/data/mm/recipes/structures/test_all.json delete mode 100644 src/test/resources/data/mm/recipes/structures/test_fe.json delete mode 100644 src/test/resources/data/mm/recipes/structures/test_fluid.json delete mode 100644 src/test/resources/data/mm/recipes/structures/test_gas.json delete mode 100644 src/test/resources/data/mm/recipes/structures/test_infuse.json delete mode 100644 src/test/resources/data/mm/recipes/structures/test_items.json delete mode 100644 src/test/resources/data/mm/recipes/structures/test_mana.json delete mode 100644 src/test/resources/data/mm/recipes/structures/test_model.json delete mode 100644 src/test/resources/data/mm/recipes/structures/test_pressure.json delete mode 100644 src/test/resources/data/mm/recipes/structures/test_rotation.json delete mode 100644 src/test/resources/data/mm/recipes/structures/test_slurry.json delete mode 100644 src/test/resources/data/mm/recipes/structures/test_starlight.json delete mode 100644 src/test/resources/data/mm/recipes/structures/test_structure_tags.json delete mode 100644 src/test/resources/data/mm/recipes/structures/test_tiered_fluid.json delete mode 100644 src/test/resources/data/mm/recipes/structures/test_variable_ios.json delete mode 100644 src/test/resources/data/mm/recipes/test_fe.json delete mode 100644 src/test/resources/data/mm/recipes/test_fluid.json delete mode 100644 src/test/resources/data/mm/recipes/test_gas.json delete mode 100644 src/test/resources/data/mm/recipes/test_infuse.json delete mode 100644 src/test/resources/data/mm/recipes/test_items.json delete mode 100644 src/test/resources/data/mm/recipes/test_items_tag.json delete mode 100644 src/test/resources/data/mm/recipes/test_mana.json delete mode 100644 src/test/resources/data/mm/recipes/test_pressure.json delete mode 100644 src/test/resources/data/mm/recipes/test_rotation.json delete mode 100644 src/test/resources/data/mm/recipes/test_slurry.json delete mode 100644 src/test/resources/data/mm/recipes/test_starlight.json delete mode 100644 src/test/resources/data/mm/recipes/test_tiered_fluid.json delete mode 100644 version.properties diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index b487a69..0000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: "[BUG]" -labels: bug -assignees: ticticboooom, MasterSloth1 - ---- - - -# Version Information -Forge version: -Masterful Machinery version: - -ADD ON'S -if not installed just put "null" -Optifine version: -Botania version: -Create version: -Mekanism version: -Pneumaticcraft version: -Astral Sorcery version: - -# Further Information -Link to latest.log: (please use a paste site such as [gist](https://gist.github.com/), do not attach the .txt or paste the log inline)\ -Steps to reproduce: -1. -2. -3. -etc... - -What I expected to happen: - - -What happened instead: diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml deleted file mode 100644 index 15bdca6..0000000 --- a/.github/workflows/gradle.yml +++ /dev/null @@ -1,27 +0,0 @@ -# This workflow will build a Java project with Gradle -# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle - -name: Java CI with Gradle - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - name: Build with Gradle - run: ./gradlew build diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index b0cbe2b..0000000 --- a/LICENSE.txt +++ /dev/null @@ -1,520 +0,0 @@ -Unless noted below, Minecraft Forge, Forge Mod Loader, and all -parts herein are licensed under the terms of the LGPL 2.1 found -here http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt and -copied below. - -Homepage: http://minecraftforge.net/ - https://github.com/MinecraftForge/MinecraftForge - - -A note on authorship: -All source artifacts are property of their original author, with -the exclusion of the contents of the patches directory and others -copied from it from time to time. Authorship of the contents of -the patches directory is retained by the Minecraft Forge project. -This is because the patches are partially machine generated -artifacts, and are changed heavily due to the way forge works. -Individual attribution within them is impossible. - -Consent: -All contributions to Forge must consent to the release of any -patch content to the Forge project. - -A note on infectivity: -The LGPL is chosen specifically so that projects may depend on Forge -features without being infected with its license. That is the -purpose of the LGPL. Mods and others using this code via ordinary -Java mechanics for referencing libraries are specifically not bound -by Forge's license for the Mod code. - - -=== MCP Data === -This software includes data from the Minecraft Coder Pack (MCP), with kind permission -from them. The license to MCP data is not transitive - distribution of this data by -third parties requires independent licensing from the MCP team. This data is not -redistributable without permission from the MCP team. - -=== Sharing === -I grant permission for some parts of FML to be redistributed outside the terms of the LGPL, for the benefit of -the minecraft modding community. All contributions to these parts should be licensed under the same additional grant. - --- Runtime patcher -- -License is granted to redistribute the runtime patcher code (src/main/java/net/minecraftforge/fml/common/patcher -and subdirectories) under any alternative open source license as classified by the OSI (http://opensource.org/licenses) - --- ASM transformers -- -License is granted to redistribute the ASM transformer code (src/main/java/net/minecraftforge/common/asm/ and subdirectories) -under any alternative open source license as classified by the OSI (http://opensource.org/licenses) - -========================================================================= -This software includes portions from the Apache Maven project at -http://maven.apache.org/ specifically the ComparableVersion.java code. It is -included based on guidelines at -http://www.softwarefreedom.org/resources/2007/gpl-non-gpl-collaboration.html -with notices intact. The only change is a non-functional change of package name. - -This software contains a partial repackaging of javaxdelta, a BSD licensed program for generating -binary differences and applying them, sourced from the subversion at http://sourceforge.net/projects/javaxdelta/ -authored by genman, heikok, pivot. -The only changes are to replace some Trove collection types with standard Java collections, and repackaged. -========================================================================= - - - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS diff --git a/README.md b/README.md deleted file mode 100644 index 3c9975d..0000000 --- a/README.md +++ /dev/null @@ -1,13 +0,0 @@ -![masterful_machinery_cover](https://user-images.githubusercontent.com/55724525/117580477-1955d200-b0c6-11eb-9d40-52b62bbb9881.png) - -# Masterful Machinery -### Masterful Machinery is a mod about creating customisable and complex multiblocks machines. Everything in the mod is customisable with Datapacks and configuration files. - -Visit [the wiki](https://github.com/TicTicBoooom-Mods/MasterfulMachinery/wiki) to have more informations on how to use the mod. - -# Download -You can download the mod on the [curseforge page](https://www.curseforge.com/minecraft/mc-mods/masterful-machinery). - -Additional Resources: -========================= -Mod Discord: https://discord.gg/NCSRkkPbmF diff --git a/build.gradle b/build.gradle index 5548b69..cb613c6 100644 --- a/build.gradle +++ b/build.gradle @@ -1,39 +1,28 @@ buildscript { repositories { - maven { url "https://plugins.gradle.org/m2/" } - maven { url = 'https://files.minecraftforge.net/maven' } + // These repositories are only for Gradle plugins, put any other repositories in the repository block further below + maven { url = 'https://maven.minecraftforge.net' } mavenCentral() - maven { url "https://repo.spongepowered.org/maven/" } } dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '4.1.+', changing: true - classpath 'org.spongepowered:mixingradle:0.7-SNAPSHOT' + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true } } - -plugins { - id 'com.github.johnrengelman.shadow' version '4.0.4' -} - apply plugin: 'net.minecraftforge.gradle' // Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. apply plugin: 'eclipse' apply plugin: 'maven-publish' -apply plugin: 'org.spongepowered.mixin' -version = '1.16.5-0.1.57-B' + getVersionNumber() -group = 'com.ticticboooom.mods.mm' // http://maven.apache.org/guides/mini/guide-naming-conventions.html -archivesBaseName = 'MasterfulMachinery' -java.toolchain.languageVersion = JavaLanguageVersion.of(8) // Mojang ships Java 8 to end users, so your mod should target Java 8. +version = '0.1.0-1.18' +group = 'live.ticticboooom.mods' // http://maven.apache.org/guides/mini/guide-naming-conventions.html +archivesBaseName = 'masterfulmachinery' -configurations { - shade - compile.extendsFrom shade -} +// Mojang ships Java 17 to end users in 1.18+, so your mod should target Java 17. +java.toolchain.languageVersion = JavaLanguageVersion.of(17) println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + '(' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch')) minecraft { - // The mappings can be changed at any time, and must be in the following format. + // The mappings can be changed at any time and must be in the following format. // Channel: Version: // snapshot YYYYMMDD Snapshot are built nightly. // stable # Stables are built at the discretion of the MCP team. @@ -42,22 +31,20 @@ minecraft { // You must be aware of the Mojang license when using the 'official' mappings. // See more information here: https://github.com/MinecraftForge/MCPConfig/blob/master/Mojang.md // - // Use non-default mappings at your own risk. they may not always work. + // Use non-default mappings at your own risk. They may not always work. // Simply re-run your setup task after changing the mappings to update your workspace. - mappings channel: 'snapshot', version: '20210309-1.16.5' - // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. + mappings channel: 'official', version: '1.18' - // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') + // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') // Currently, this location cannot be changed from the default. // Default run configurations. // These can be tweaked, removed, or duplicated as needed. runs { client { workingDirectory project.file('run') - arg '-mixin.config=masterfulmachinery.mixins.json' // Recommended logging data for a userdev environment - // The markers can be changed as needed. + // The markers can be added/remove as needed separated by commas. // "SCAN": For mods scan. // "REGISTRIES": For firing of registry events. // "REGISTRYDUMP": For getting the contents of all registries. @@ -67,13 +54,12 @@ minecraft { // You can set various levels here. // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels property 'forge.logging.console.level', 'debug' - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${buildDir}/createSrgToMcp/output.srg" + mods { masterfulmachinery { source sourceSets.main } - mmtest { + masterfulmachinery_test { source sourceSets.test } } @@ -81,9 +67,9 @@ minecraft { server { workingDirectory project.file('run') - arg '-mixin.config=masterfulmachinery.mixins.json' + // Recommended logging data for a userdev environment - // The markers can be changed as needed. + // The markers can be added/remove as needed separated by commas. // "SCAN": For mods scan. // "REGISTRIES": For firing of registry events. // "REGISTRYDUMP": For getting the contents of all registries. @@ -93,13 +79,12 @@ minecraft { // You can set various levels here. // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels property 'forge.logging.console.level', 'debug' - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${buildDir}/createSrgToMcp/output.srg" + mods { masterfulmachinery { source sourceSets.main } - mmtest { + masterfulmachinery_test { source sourceSets.test } } @@ -109,148 +94,84 @@ minecraft { workingDirectory project.file('run') // Recommended logging data for a userdev environment - // The markers can be changed as needed. + // The markers can be added/remove as needed separated by commas. // "SCAN": For mods scan. // "REGISTRIES": For firing of registry events. // "REGISTRYDUMP": For getting the contents of all registries. property 'forge.logging.markers', 'REGISTRIES' - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${buildDir}/createSrgToMcp/output.srg" + // Recommended logging level for the console // You can set various levels here. // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels property 'forge.logging.console.level', 'debug' // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. - args '--mod', 'masterfulmachinery', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') + args '--mod', 'examplemod', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') mods { masterfulmachinery { source sourceSets.main } + masterfulmachinery_test { + source sourceSets.test + } } } } } -shadowJar { - configurations = [project.configurations.shade] -} - +// Include resources generated by data generators. +sourceSets.main.resources { srcDir 'src/generated/resources' } repositories { - maven { url 'https://modmaven.dev/' } - maven { - name = "Cursemaven" - url = "https://www.cursemaven.com/" - } - maven { - url 'https://repo.spongepowered.org/maven/' - } - maven { - name 'HellFirePvP' - url 'https://maven.hellfiredev.net/' - } + // Put repositories for dependencies here + // ForgeGradle automatically adds the Forge maven and Maven Central for you - maven { - name 'Curios' - url "https://maven.theillusivec4.top/" - } - maven { url 'https://maven.blamejared.com' } - maven { - url = "https://maven.saps.dev/minecraft" - content { - includeGroup "dev.latvian.mods" - } - } - maven { - // Shedaniel's maven (Architectury API) - url = "https://maven.architectury.dev" - content { - includeGroup "me.shedaniel" - } - } + // If you have mod jar dependencies in ./libs, you can declare them as a repository like so: + // flatDir { + // dir 'libs' + // } } + dependencies { - // Specify the version of Minecraft to use, If this is any group other then 'net.minecraft' it is assumed - // that the dep is a ForgeGradle 'patcher' dependency. And it's patches will be applied. + // Specify the version of Minecraft to use. If this is any group other than 'net.minecraft', it is assumed + // that the dep is a ForgeGradle 'patcher' dependency, and its patches will be applied. // The userdev artifact is a special name and will get all sorts of transformations applied to it. - compileOnly 'org.projectlombok:lombok:1.18.18' - annotationProcessor 'org.projectlombok:lombok:1.18.18' - minecraft 'net.minecraftforge:forge:1.16.5-36.1.23' + minecraft 'net.minecraftforge:forge:1.18-38.0.5' - compileOnly 'com.google.code.gson:gson:2.8.7' - implementation 'org.spongepowered:mixin:0.8-SNAPSHOT' - annotationProcessor 'org.spongepowered:mixin:0.8.2:processor' + // Real mod deobf dependency examples - these get remapped to your current mappings + // compileOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}:api") // Adds JEI API as a compile dependency + // runtimeOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}") // Adds the full JEI mod as a runtime dependency + // implementation fg.deobf("com.tterrag.registrate:Registrate:MC${mc_version}-${registrate_version}") // Adds registrate as a dependency - implementation fg.deobf("mekanism:Mekanism:${mekanism_version}")// core - runtimeOnly fg.deobf("mekanism:Mekanism:${mekanism_version}:additions")// Mekanism: Additions - runtimeOnly fg.deobf("mekanism:Mekanism:${mekanism_version}:generators")// Mekanism: Generators - runtimeOnly fg.deobf("mekanism:Mekanism:${mekanism_version}:tools")// Mekanism: Tools - - compileOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}:api") - // at runtime, use the full JEI jar - runtimeOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}") - implementation fg.deobf('me.desht.pneumaticcraft:pneumaticcraft-repressurized:1.16.5-2.12.2-186') - - implementation fg.deobf("curse.maven:hwyla-253449:3033593") - - implementation fg.deobf("curse.maven:create-328085:3384222") - implementation fg.deobf("curse.maven:flywheel-486392:3384004") - - implementation fg.deobf("curse.maven:astral-sorcery-241721:3156477") - implementation fg.deobf("curse.maven:observerlib-316833:3162044") - // runtime deps - runtimeOnly fg.deobf("curse.maven:curios-309927:3231111") - compileOnly fg.deobf("vazkii.botania:Botania:1.16.5-416:api") - runtimeOnly fg.deobf("vazkii.botania:Botania:1.16.5-416") - - runtimeOnly fg.deobf("vazkii.patchouli:Patchouli:1.16.4-51") - - implementation "dev.latvian.mods:rhino:1605.1.0-build.4" - implementation fg.deobf("me.shedaniel:architectury-forge:v1.15.13") - implementation fg.deobf("dev.latvian.mods:kubejs-forge:1605.3.10-build.8") - // You may put jars on which you depend on in ./libs or you may define them like so.. - // compile "some.group:artifact:version:classifier" - // compile "some.group:artifact:version" - - // Real examples - // compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env - // compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env - - // The 'provided' configuration is for optional dependencies that exist at compile-time but might not at runtime. - // provided 'com.mod-buildcraft:buildcraft:6.0.8:dev' - - // These dependencies get remapped to your current MCP mappings - // deobf 'com.mod-buildcraft:buildcraft:6.0.8:dev' + // Examples using mod jars from ./libs + // implementation fg.deobf("blank:coolmod-${mc_version}:${coolmod_version}") // For more info... // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html // http://www.gradle.org/docs/current/userguide/dependency_management.html - } -// Example for how to get properties into the manifest for reading by the runtime.. +// Example for how to get properties into the manifest for reading at runtime. jar { manifest { attributes([ - "MixinConfigs" : "masterfulmachinery.mixins.json", "Specification-Title" : "masterfulmachinery", - "Specification-Vendor" : "ticticboooom", + "Specification-Vendor" : "masterfulmachinerysareus", "Specification-Version" : "1", // We are version 1 of ourselves "Implementation-Title" : project.name, - "Implementation-Version" : "${version}", - "Implementation-Vendor" : "TicTicBoooom", + "Implementation-Version" : project.jar.archiveVersion, + "Implementation-Vendor" : "masterfulmachinerysareus", "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") ]) } } -// Example configuration to allow publishing using the maven-publish task +// Example configuration to allow publishing using the maven-publish plugin // This is the preferred method to reobfuscate your jar file -jar.finalizedBy('reobfShadowJar') +jar.finalizedBy('reobfJar') // However if you are in a multi-project build, dev time needs unobfed jar files, so you can delay the obfuscation until publishing by doing -//publish.dependsOn('reobfJar') +// publish.dependsOn('reobfJar') publishing { publications { @@ -260,47 +181,7 @@ publishing { } repositories { maven { - url "file:///${project.projectDir}/mcmodsrepo" + url "file://${project.projectDir}/mcmodsrepo" } } } - -reobf { - shadowJar { - dependsOn createMcpToSrg - mappings = createMcpToSrg.outputs.files.singleFile - } -} - -def getVersionNumber() { - def vFile = file('version.properties') - def Integer buildNumber = 0 - if (vFile.canRead()) { - def Properties versionProps = new Properties(); - - versionProps.load(new FileInputStream(vFile)) - - def code = versionProps.getProperty("VERSION_CODE").toInteger() + 1 - buildNumber = code - versionProps.setProperty("VERSION_CODE", code.toString()) - - versionProps.store(vFile.newWriter(), null) - } - return buildNumber.toString() -} - -mixin { - add sourceSets.main, "masterfulmachinery.refmap.json" -} - -artifacts { - archives shadowJar - shadow shadowJar -} - -reobf { - shadowJar { - dependsOn createMcpToSrg - mappings = createMcpToSrg.outputs.files.singleFile - } -} \ No newline at end of file diff --git a/demo_config/config/masterful_machinery/controllers/basic.json b/demo_config/config/masterful_machinery/controllers/basic.json deleted file mode 100644 index 06f88e9..0000000 --- a/demo_config/config/masterful_machinery/controllers/basic.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "controllerId": "basic", - "name": "Basic", - "ports": [ - { - "type": "masterfulmachinery:items", - "textureOverride": "minecraft:block/white_terracotta", - "name": "Item", - "id": "simple", - "data": { - "rows": 1, - "columns": 1 - } - }, - { - "type": "masterfulmachinery:energy", - "name": "Energy", - "id": "simple", - "data": { - "capacity": 1000000 - } - }, - { - "type": "masterfulmachinery:fluids", - "name": "Fluid", - "id": "simple", - "data": { - "capacity": 5000 - } - }, - { - "type": "masterfulmachinery:pncr_pressure", - "name": "Pressure", - "id": "simple", - "data": { - "criticalPressure": 7, - "dangerPressure": 5, - "volume": 7000 - } - }, - { - "type": "masterfulmachinery:botania_mana", - "name": "Mana", - "id": "simple", - "data": { - "capacity": 50000 - } - }, - { - "type": "masterfulmachinery:astral_starlight", - "name": "Starlight", - "id": "simple", - "data": { - "capacity": 500 - } - }, - { - "type": "masterfulmachinery:create_rotation", - "name": "Rotation", - "id": "simple", - "data": { - "stress": 32 - } - }, - { - "type": "masterfulmachinery:mekanism_gas", - "name": "Gas", - "id": "simple", - "data": { - "capacity": 100000 - } - }, - { - "type": "masterfulmachinery:mekanism_slurry", - "name": "Slurry", - "id": "simple", - "data": { - "capacity": 100000 - } - }, - { - "type": "masterfulmachinery:mekanism_infuse", - "name": "Infuse", - "id": "simple", - "data": { - "capacity": 100000 - } - }, - { - "type": "masterfulmachinery:weather", - "name": "Weather", - "id": "simple", - "data": {} - } - ] -} \ No newline at end of file diff --git a/demo_config/config/masterful_machinery/controllers/mid.json b/demo_config/config/masterful_machinery/controllers/mid.json deleted file mode 100644 index 589aa7c..0000000 --- a/demo_config/config/masterful_machinery/controllers/mid.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "controllerId": "mid", - "name": "Mid", - "ports": [ - { - "type": "masterfulmachinery:items", - "textureOverride": "minecraft:block/red_terracotta", - "name": "Item", - "id": "intermediate", - "data": { - "rows": 3, - "columns": 3 - } - }, - { - "type": "masterfulmachinery:energy", - "textureOverride": "minecraft:block/red_terracotta", - "name": "Energy", - "id": "intermediate", - "data": { - "capacity": 1000000000 - } - }, - { - "type": "masterfulmachinery:fluids", - "textureOverride": "minecraft:block/red_terracotta", - "name": "Fluid", - "id": "intermediate", - "data": { - "capacity": 10000 - } - }, - { - "type": "masterfulmachinery:pncr_pressure", - "textureOverride": "minecraft:block/red_terracotta", - "name": "Pressure", - "id": "intermediate", - "data": { - "criticalPressure": 7, - "dangerPressure": 5, - "volume": 10000 - } - }, - { - "type": "masterfulmachinery:botania_mana", - "textureOverride": "minecraft:block/red_terracotta", - "name": "Mana", - "id": "intermediate", - "data": { - "capacity": 100000 - } - }, - { - "type": "masterfulmachinery:astral_starlight", - "textureOverride": "minecraft:block/red_terracotta", - "name": "Starlight", - "id": "intermediate", - "data": { - "capacity": 1000 - } - }, - { - "type": "masterfulmachinery:create_rotation", - "textureOverride": "minecraft:block/red_terracotta", - "name": "Rotation", - "id": "intermediate", - "data": { - "stress": 128 - } - }, - { - "type": "masterfulmachinery:mekanism_gas", - "textureOverride": "minecraft:block/red_terracotta", - "name": "Gas", - "id": "intermediate", - "data": { - "capacity": 100000000 - } - }, - { - "type": "masterfulmachinery:mekanism_slurry", - "textureOverride": "minecraft:block/red_terracotta", - "name": "Slurry", - "id": "intermediate", - "data": { - "capacity": 100000000 - } - }, - { - "type": "masterfulmachinery:mekanism_infuse", - "textureOverride": "minecraft:block/red_terracotta", - "name": "Infuse", - "id": "intermediate", - "data": { - "capacity": 100000000 - } - }, - { - "type": "masterfulmachinery:weather", - "textureOverride": "minecraft:block/red_terracotta", - "name": "Weather", - "id": "intermediate", - "data": {} - } - ] -} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index fa070cb..878bf1f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,4 @@ # Sets default memory used for gradle commands. Can be overridden by user or command line properties. # This is required to provide enough memory for the Minecraft decompilation process. org.gradle.jvmargs=-Xmx3G -org.gradle.daemon=false -mekanism_version=1.16.5-10.0.20.447 -mc_version=1.16.5 -jei_version=7.+ \ No newline at end of file +org.gradle.daemon=false \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e708b1c023ec8b20f512888fe07c5bd3ff77bb8f..7454180f2ae8848c63b8b4dea2cb829da983f2fa 100644 GIT binary patch delta 18435 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 B8dv}T delta 17845 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 X49Luk)baa85H9$5YCsTPT`SVRWMtMW diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 28ff446..e750102 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 4f906e0..c53aefa 100644 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,67 +17,101 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -106,80 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index 8612bc7..0000000 --- a/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = "masterfulmachinery" \ No newline at end of file diff --git a/src/main/java/com/ticticboooom/mods/mm/MM.java b/src/main/java/com/ticticboooom/mods/mm/MM.java deleted file mode 100644 index c0d3404..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/MM.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.ticticboooom.mods.mm; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; -import com.google.gson.Gson; -import com.ticticboooom.mods.mm.block.ControllerBlock; -import com.ticticboooom.mods.mm.block.MachinePortBlock; -import com.ticticboooom.mods.mm.block.container.ControllerBlockContainer; -import com.ticticboooom.mods.mm.block.container.PortBlockContainer; -import com.ticticboooom.mods.mm.client.screen.ControllerBlockContainerScreen; -import com.ticticboooom.mods.mm.client.screen.PortBlockContainerScreen; -import com.ticticboooom.mods.mm.client.screen.StructureGenBlockContainerScreen; -import com.ticticboooom.mods.mm.client.ter.StructureGenTileEntityRenderer; -import com.ticticboooom.mods.mm.datagen.MMPackFinder; -import com.ticticboooom.mods.mm.datagen.DataGeneratorFactory; -import com.ticticboooom.mods.mm.datagen.PackType; -import com.ticticboooom.mods.mm.datagen.gen.runtime.MMBlockStateProvider; -import com.ticticboooom.mods.mm.datagen.gen.runtime.MMItemModelProvider; -import com.ticticboooom.mods.mm.datagen.gen.runtime.MMLangProvider; -import com.ticticboooom.mods.mm.datagen.gen.runtime.MMLootTableProvider; -import com.ticticboooom.mods.mm.network.PacketHandler; -import com.ticticboooom.mods.mm.registration.MMLoader; -import com.ticticboooom.mods.mm.registration.MMPorts; -import com.ticticboooom.mods.mm.registration.MMSetup; -import com.ticticboooom.mods.mm.registration.RecipeTypes; -import lombok.SneakyThrows; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.ScreenManager; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.RenderTypeLookup; -import net.minecraft.data.DataGenerator; -import net.minecraft.inventory.container.ContainerType; -import net.minecraft.resources.ResourcePackList; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.fml.ModLoader; -import net.minecraftforge.fml.RegistryObject; -import net.minecraftforge.fml.client.registry.ClientRegistry; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; -import net.minecraftforge.fml.event.server.FMLServerAboutToStartEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import net.minecraftforge.fml.loading.FMLEnvironment; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.io.IOException; - -@Mod(MM.ID) -public class MM { - public static final String ID = "masterfulmachinery"; - public static final Logger LOG = LogManager.getLogger("Masterful Machinery"); - public static final Gson GSON = new Gson(); - - private DataGenerator generator; - private static boolean hasGenerated = false; - private static MM instance; - - @SneakyThrows - public MM() { - instance = this; - MMPorts.init(); - DataGeneratorFactory.init(); - PacketHandler.init(); - registerDataGen(); - IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); - MMSetup.BLOCKS_REG.register(bus); - MMSetup.ITEMS_REG.register(bus); - MMSetup.TILES_REG.register(bus); - MMSetup.CONTAINER_REG.register(bus); - RecipeTypes.RECIPE_SERIALIZERS.register(bus); - bus.addListener(this::clientEvents); - try { - if (FMLEnvironment.dist == Dist.CLIENT) { - Minecraft.getInstance().getResourcePackList().addPackFinder(new MMPackFinder(PackType.RESOURCE)); - } - } catch (Exception ignored) { - } - - - MinecraftForge.EVENT_BUS.addListener(this::onServerStart); - } - - private void registerDataGen() { - generator = DataGeneratorFactory.createMemoryDataGenerator(); - ExistingFileHelper existingFileHelper = new ExistingFileHelper(ImmutableList.of(), ImmutableSet.of(), false); - generator.addProvider(new MMLootTableProvider(generator)); - - if (FMLEnvironment.dist != Dist.DEDICATED_SERVER) { - generator.addProvider(new MMBlockStateProvider(generator, existingFileHelper)); - generator.addProvider(new MMItemModelProvider(generator, existingFileHelper)); - generator.addProvider(new MMLangProvider(generator)); - } - } - - - - public static void generate() { - if (!hasGenerated) { - try { - if (!ModLoader.isLoadingStateValid()){ - return; - } - instance.generator.run(); - } catch (IOException e) { - e.printStackTrace(); - } - hasGenerated = true; - } - } - - - public void onServerStart(final FMLServerAboutToStartEvent event) { - event.getServer().getResourcePacks().addPackFinder(new MMPackFinder(PackType.DATA)); - } - - - private void clientEvents(final FMLClientSetupEvent event) { - - for (RegistryObject> container : MMLoader.CONTAINERS) { - ScreenManager.registerFactory(container.get(), ControllerBlockContainerScreen::new); - } - - for (RegistryObject> container : MMLoader.PORT_CONTAINERS) { - ScreenManager.registerFactory((ContainerType) container.get(), PortBlockContainerScreen::new); - } - - for (RegistryObject block : MMLoader.BLOCKS) { - RenderTypeLookup.setRenderLayer(block.get(), layer -> layer == RenderType.getSolid() || layer == RenderType.getTranslucent()); - } - - for (RegistryObject block : MMLoader.IPORT_BLOCKS) { - RenderTypeLookup.setRenderLayer(block.get(), layer -> layer == RenderType.getSolid() || layer == RenderType.getTranslucent()); - } - - for (RegistryObject block : MMLoader.OPORT_BLOCKS) { - RenderTypeLookup.setRenderLayer(block.get(), layer -> layer == RenderType.getSolid() || layer == RenderType.getTranslucent()); - } - - - RenderTypeLookup.setRenderLayer(MMSetup.PROJECTOR_BLOCK.get(), RenderType.getTranslucent()); - ScreenManager.registerFactory(MMSetup.STRUCTURE_CONTAINER.get(), StructureGenBlockContainerScreen::new); - ClientRegistry.bindTileEntityRenderer(MMSetup.STRUCTURE_TILE.get(), StructureGenTileEntityRenderer::new); - } - - public static void injectDatapackFinder(ResourcePackList resourcePacks) { - if (DistExecutor.unsafeRunForDist(() -> () -> resourcePacks != Minecraft.getInstance().getResourcePackList(), () -> () -> true)) { - resourcePacks.addPackFinder(new MMPackFinder(PackType.RESOURCE)); - MM.LOG.info("Injecting data pack finder."); - } - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/block/ControllerBlock.java b/src/main/java/com/ticticboooom/mods/mm/block/ControllerBlock.java deleted file mode 100644 index 18b4d2e..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/block/ControllerBlock.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.ticticboooom.mods.mm.block; - -import com.ticticboooom.mods.mm.block.tile.ControllerBlockEntity; -import com.ticticboooom.mods.mm.model.ModelOverrideModel; -import lombok.Getter; -import net.minecraft.block.*; -import net.minecraft.block.material.Material; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.item.BlockItemUseContext; -import net.minecraft.state.DirectionProperty; -import net.minecraft.state.StateContainer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.util.math.shapes.IBooleanFunction; -import net.minecraft.util.math.shapes.ISelectionContext; -import net.minecraft.util.math.shapes.VoxelShape; -import net.minecraft.util.math.shapes.VoxelShapes; -import net.minecraft.world.IBlockReader; -import net.minecraft.world.World; -import net.minecraftforge.common.ToolType; -import net.minecraftforge.fml.RegistryObject; -import net.minecraftforge.fml.network.NetworkHooks; - -import javax.annotation.Nullable; -import java.util.stream.Stream; - -public class ControllerBlock extends DirectionalBlock { - private RegistryObject> type; - @Getter - private String controllerName; - @Getter - private String controllerId; - @Getter - private String texOverride; - - public ControllerBlock(RegistryObject> type, String name, String id, String texOverride) { - super(AbstractBlock.Properties.create(Material.IRON).setRequiresTool().hardnessAndResistance(5.0F, 6.0F).sound(SoundType.METAL).harvestLevel(0) - .harvestTool(ToolType.PICKAXE)); - this.type = type; - this.controllerName = name; - this.controllerId = id; - this.texOverride = texOverride; - this.setDefaultState(this.getDefaultState().with(FACING, Direction.NORTH)); - } - - @Override - protected void fillStateContainer(StateContainer.Builder builder) { - super.fillStateContainer(builder.add(FACING)); - } - - @Nullable - @Override - public BlockState getStateForPlacement(BlockItemUseContext ctx) { - return this.getDefaultState().with(FACING, ctx.getPlacementHorizontalFacing().getOpposite()); - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Nullable - @Override - public TileEntity createTileEntity(BlockState state, IBlockReader world) { - return type.get().create(); - } - - @Override - public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { - if (!worldIn.isRemote()) { - TileEntity blockEntity = worldIn.getTileEntity(pos); - if (blockEntity instanceof ControllerBlockEntity) { - NetworkHooks.openGui(((ServerPlayerEntity) player), (ControllerBlockEntity)blockEntity, pos); - } - } - return ActionResultType.SUCCESS; - } - - -} diff --git a/src/main/java/com/ticticboooom/mods/mm/block/MachinePortBlock.java b/src/main/java/com/ticticboooom/mods/mm/block/MachinePortBlock.java deleted file mode 100644 index 1766ce9..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/block/MachinePortBlock.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.ticticboooom.mods.mm.block; - -import com.ticticboooom.mods.mm.block.tile.IMachinePortTile; -import com.ticticboooom.mods.mm.block.tile.MachinePortBlockEntity; -import com.ticticboooom.mods.mm.inventory.ItemStackInventory; -import lombok.Getter; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.inventory.InventoryHelper; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Hand; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.world.IBlockReader; -import net.minecraft.world.World; -import net.minecraftforge.common.ToolType; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.fml.RegistryObject; -import net.minecraftforge.fml.network.NetworkHooks; -import net.minecraftforge.items.ItemStackHandler; - -import javax.annotation.Nullable; - -public class MachinePortBlock extends Block { - private RegistryObject> type; - @Getter - private String langName; - @Getter - private String controllerId; - @Getter - private String textureOverride; - @Getter - private ResourceLocation overlay; - @Getter - private ResourceLocation portTypeId; - - public MachinePortBlock(RegistryObject> type, String name, String controllerId, String textureOverride, ResourceLocation overlay, ResourceLocation portTypeId) { - super(AbstractBlock.Properties.create(Material.IRON).setRequiresTool().hardnessAndResistance(5.0F, 6.0F).sound(SoundType.METAL).harvestLevel(0) - .harvestTool(ToolType.PICKAXE)); - this.type = type; - this.langName = name; - this.controllerId = controllerId; - this.textureOverride = textureOverride; - this.overlay = overlay; - this.portTypeId = portTypeId; - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Nullable - @Override - public TileEntity createTileEntity(BlockState state, IBlockReader world) { - return type.get().create(); - } - - - @Override - public ActionResultType onBlockActivated(BlockState state, World level, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult traceResult) { - if (!level.isRemote()) { - TileEntity blockEntity = level.getTileEntity(pos); - if (blockEntity instanceof IMachinePortTile) { - IMachinePortTile port = (IMachinePortTile) blockEntity; - if (!port.getStorage().onPortActivated(state, level, pos, player, hand ,traceResult)) { - NetworkHooks.openGui(((ServerPlayerEntity) player), port, pos); - } - } - } - - return ActionResultType.SUCCESS; - } - - - @Override - public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { - TileEntity tile = worldIn.getTileEntity(pos); - super.onReplaced(state, worldIn, pos, newState, isMoving); - if (tile instanceof MachinePortBlockEntity){ - LazyOptional lo = ((MachinePortBlockEntity) tile).getStorage().getLO(); - if (lo == null){ - return; - } - Object o = lo.orElse(null); - if (o instanceof ItemStackHandler) { - InventoryHelper.dropInventoryItems(worldIn, pos, new ItemStackInventory((ItemStackHandler) o)); - } - } - tile.remove(); - } - - - @Override - public void neighborChanged(BlockState p_220069_1_, World world, BlockPos pos, Block p_220069_4_, BlockPos changedPos, boolean p_220069_6_) { - super.neighborChanged(p_220069_1_, world, pos, p_220069_4_, changedPos, p_220069_6_); - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof IMachinePortTile){ - ((IMachinePortTile) tile).getStorage().neighborChanged(); - } - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/block/ProjectorBlock.java b/src/main/java/com/ticticboooom/mods/mm/block/ProjectorBlock.java deleted file mode 100644 index e6140fa..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/block/ProjectorBlock.java +++ /dev/null @@ -1,164 +0,0 @@ -package com.ticticboooom.mods.mm.block; - -import com.ticticboooom.mods.mm.registration.MMSetup; -import net.minecraft.block.*; -import net.minecraft.block.material.Material; -import net.minecraft.item.BlockItemUseContext; -import net.minecraft.state.DirectionProperty; -import net.minecraft.state.StateContainer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.shapes.IBooleanFunction; -import net.minecraft.util.math.shapes.ISelectionContext; -import net.minecraft.util.math.shapes.VoxelShape; -import net.minecraft.util.math.shapes.VoxelShapes; -import net.minecraft.world.IBlockReader; -import net.minecraftforge.common.ToolType; - -import javax.annotation.Nullable; -import java.util.stream.Stream; - -public class ProjectorBlock extends Block { - public ProjectorBlock() { - super(AbstractBlock.Properties.create(Material.IRON).setRequiresTool().hardnessAndResistance(5.0F, 6.0F).sound(SoundType.METAL).harvestLevel(0) - .harvestTool(ToolType.PICKAXE)); - this.setDefaultState(this.getDefaultState().with(FACING, Direction.NORTH)); - } - - private static final DirectionProperty FACING = HorizontalBlock.HORIZONTAL_FACING; - - private static final VoxelShape SHAPE_N = Stream.of( - Block.makeCuboidShape(4, 2, 4, 12, 3, 12), - Block.makeCuboidShape(4, 0, 4, 12, 1, 12), - Block.makeCuboidShape(6, 2.5, 6, 10, 3.5, 10), - Block.makeCuboidShape(5, 1, 5, 11, 2, 11), - Block.makeCuboidShape(5, 6, 5, 11, 12, 11), - Block.makeCuboidShape(0.75, 2.5, 6.75, 2.25, 4.75, 9.25), - Block.makeCuboidShape(13.75, 2.5, 6.75, 15.25, 4.75, 9.25), - Block.makeCuboidShape(6, 3.5, 14, 7, 12.75, 15), - Block.makeCuboidShape(5.75, 11.25, 13.75, 7.25, 13.5, 15.25), - Block.makeCuboidShape(5.75, 2.5, 13.75, 7.25, 4.75, 15.25), - Block.makeCuboidShape(8.75, 11.25, 13.75, 10.25, 13.5, 15.25), - Block.makeCuboidShape(8.75, 2.5, 13.75, 10.25, 4.75, 15.25), - Block.makeCuboidShape(9, 3.5, 14, 10, 12.75, 15), - Block.makeCuboidShape(1.25, 6.25, 7.5, 2.25, 7.25, 8.5), - Block.makeCuboidShape(13.75, 6.25, 7.5, 14.75, 7.25, 8.5), - Block.makeCuboidShape(14, 3.5, 7, 15, 7.75, 9), - Block.makeCuboidShape(1, 3.5, 7, 2, 7.75, 9), - Block.makeCuboidShape(11, 2, 6, 15, 4, 10), - Block.makeCuboidShape(1, 2, 6, 5, 4, 10), - Block.makeCuboidShape(6, 2, 11, 10, 4, 15), - Block.makeCuboidShape(6, 12, 9, 10, 15, 15) - ).reduce((v1, v2) -> VoxelShapes.combineAndSimplify(v1, v2, IBooleanFunction.OR)).get(); - - private static final VoxelShape SHAPE_E = Stream.of( - Block.makeCuboidShape(4, 2, 4, 12, 3, 12), - Block.makeCuboidShape(4, 0, 4, 12, 1, 12), - Block.makeCuboidShape(6, 2.5, 6, 10, 3.5, 10), - Block.makeCuboidShape(5, 1, 5, 11, 2, 11), - Block.makeCuboidShape(5, 6, 5, 11, 12, 11), - Block.makeCuboidShape(6.75, 2.5, 0.75, 9.25, 4.75, 2.25), - Block.makeCuboidShape(6.75, 2.5, 13.75, 9.25, 4.75, 15.25), - Block.makeCuboidShape(1, 3.5, 6, 2, 12.75, 7), - Block.makeCuboidShape(0.75, 11.25, 5.75, 2.25, 13.5, 7.25), - Block.makeCuboidShape(0.75, 2.5, 5.75, 2.25, 4.75, 7.25), - Block.makeCuboidShape(0.75, 11.25, 8.75, 2.25, 13.5, 10.25), - Block.makeCuboidShape(0.75, 2.5, 8.75, 2.25, 4.75, 10.25), - Block.makeCuboidShape(1, 3.5, 9, 2, 12.75, 10), - Block.makeCuboidShape(7.5, 6.25, 1.25, 8.5, 7.25, 2.25), - Block.makeCuboidShape(7.5, 6.25, 13.75, 8.5, 7.25, 14.75), - Block.makeCuboidShape(7, 3.5, 14, 9, 7.75, 15), - Block.makeCuboidShape(7, 3.5, 1, 9, 7.75, 2), - Block.makeCuboidShape(6, 2, 11, 10, 4, 15), - Block.makeCuboidShape(6, 2, 1, 10, 4, 5), - Block.makeCuboidShape(1, 2, 6, 5, 4, 10), - Block.makeCuboidShape(1, 12, 6, 7, 15, 10) - ).reduce((v1, v2) -> VoxelShapes.combineAndSimplify(v1, v2, IBooleanFunction.OR)).get(); - - private static final VoxelShape SHAPE_S = Stream.of( - Block.makeCuboidShape(4, 2, 4, 12, 3, 12), - Block.makeCuboidShape(4, 0, 4, 12, 1, 12), - Block.makeCuboidShape(6, 2.5, 6, 10, 3.5, 10), - Block.makeCuboidShape(5, 1, 5, 11, 2, 11), - Block.makeCuboidShape(5, 6, 5, 11, 12, 11), - Block.makeCuboidShape(13.75, 2.5, 6.75, 15.25, 4.75, 9.25), - Block.makeCuboidShape(0.75, 2.5, 6.75, 2.25, 4.75, 9.25), - Block.makeCuboidShape(9, 3.5, 1, 10, 12.75, 2), - Block.makeCuboidShape(8.75, 11.25, 0.75, 10.25, 13.5, 2.25), - Block.makeCuboidShape(8.75, 2.5, 0.75, 10.25, 4.75, 2.25), - Block.makeCuboidShape(5.75, 11.25, 0.75, 7.25, 13.5, 2.25), - Block.makeCuboidShape(5.75, 2.5, 0.75, 7.25, 4.75, 2.25), - Block.makeCuboidShape(6, 3.5, 1, 7, 12.75, 2), - Block.makeCuboidShape(13.75, 6.25, 7.5, 14.75, 7.25, 8.5), - Block.makeCuboidShape(1.25, 6.25, 7.5, 2.25, 7.25, 8.5), - Block.makeCuboidShape(1, 3.5, 7, 2, 7.75, 9), - Block.makeCuboidShape(14, 3.5, 7, 15, 7.75, 9), - Block.makeCuboidShape(1, 2, 6, 5, 4, 10), - Block.makeCuboidShape(11, 2, 6, 15, 4, 10), - Block.makeCuboidShape(6, 2, 1, 10, 4, 5), - Block.makeCuboidShape(6, 12, 1, 10, 15, 7) - ).reduce((v1, v2) -> VoxelShapes.combineAndSimplify(v1, v2, IBooleanFunction.OR)).get(); - - private static final VoxelShape SHAPE_W = Stream.of( - Block.makeCuboidShape(4, 2, 4, 12, 3, 12), - Block.makeCuboidShape(4, 0, 4, 12, 1, 12), - Block.makeCuboidShape(6, 2.5, 6, 10, 3.5, 10), - Block.makeCuboidShape(5, 1, 5, 11, 2, 11), - Block.makeCuboidShape(5, 6, 5, 11, 12, 11), - Block.makeCuboidShape(6.75, 2.5, 13.75, 9.25, 4.75, 15.25), - Block.makeCuboidShape(6.75, 2.5, 0.75, 9.25, 4.75, 2.25), - Block.makeCuboidShape(14, 3.5, 9, 15, 12.75, 10), - Block.makeCuboidShape(13.75, 11.25, 8.75, 15.25, 13.5, 10.25), - Block.makeCuboidShape(13.75, 2.5, 8.75, 15.25, 4.75, 10.25), - Block.makeCuboidShape(13.75, 11.25, 5.75, 15.25, 13.5, 7.25), - Block.makeCuboidShape(13.75, 2.5, 5.75, 15.25, 4.75, 7.25), - Block.makeCuboidShape(14, 3.5, 6, 15, 12.75, 7), - Block.makeCuboidShape(7.5, 6.25, 13.75, 8.5, 7.25, 14.75), - Block.makeCuboidShape(7.5, 6.25, 1.25, 8.5, 7.25, 2.25), - Block.makeCuboidShape(7, 3.5, 1, 9, 7.75, 2), - Block.makeCuboidShape(7, 3.5, 14, 9, 7.75, 15), - Block.makeCuboidShape(6, 2, 1, 10, 4, 5), - Block.makeCuboidShape(6, 2, 11, 10, 4, 15), - Block.makeCuboidShape(11, 2, 6, 15, 4, 10), - Block.makeCuboidShape(9, 12, 6, 15, 15, 10) - ).reduce((v1, v2) -> VoxelShapes.combineAndSimplify(v1, v2, IBooleanFunction.OR)).get(); - - @Override - protected void fillStateContainer(StateContainer.Builder builder) { - super.fillStateContainer(builder.add(FACING)); - } - - @Nullable - @Override - public BlockState getStateForPlacement(BlockItemUseContext ctx) { - return this.getDefaultState().with(FACING, ctx.getPlacementHorizontalFacing().getOpposite()); - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Nullable - @Override - public TileEntity createTileEntity(BlockState state, IBlockReader world) { - return MMSetup.PROJECTOR_TILE.get().create(); - } - - @Override - public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, ISelectionContext p_220053_4_) { - switch (state.get(FACING)) { - case NORTH: - return SHAPE_N; - case EAST: - return SHAPE_E; - case SOUTH: - return SHAPE_S; - case WEST: - return SHAPE_W; - default: - throw new IllegalStateException("Invalid State"); - } - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/block/RotationMachinePortBlock.java b/src/main/java/com/ticticboooom/mods/mm/block/RotationMachinePortBlock.java deleted file mode 100644 index fa4f196..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/block/RotationMachinePortBlock.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.ticticboooom.mods.mm.block; - -import com.simibubi.create.content.contraptions.base.IRotate; -import com.ticticboooom.mods.mm.block.tile.MachinePortBlockEntity; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import com.ticticboooom.mods.mm.ports.storage.StarlightPortStorage; -import hellfirepvp.astralsorcery.common.block.base.BlockStarlightRecipient; -import hellfirepvp.astralsorcery.common.constellation.IWeakConstellation; -import net.minecraft.block.BlockState; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IWorldReader; -import net.minecraft.world.World; -import net.minecraftforge.fml.RegistryObject; - -import java.util.Random; - -public class RotationMachinePortBlock extends MachinePortBlock implements IRotate { - - public RotationMachinePortBlock(RegistryObject> type, String name, String controllerId, String textureOverride, ResourceLocation overlay, ResourceLocation portTypeId) { - super(type, name, controllerId, textureOverride, overlay, portTypeId); - } - - @Override - public boolean hasShaftTowards(IWorldReader iWorldReader, BlockPos blockPos, BlockState blockState, Direction direction) { - return true; - } - - @Override - public Direction.Axis getRotationAxis(BlockState blockState) { - return Direction.Axis.X; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/block/StructureGenBlock.java b/src/main/java/com/ticticboooom/mods/mm/block/StructureGenBlock.java deleted file mode 100644 index 1e6b8f8..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/block/StructureGenBlock.java +++ /dev/null @@ -1,175 +0,0 @@ -package com.ticticboooom.mods.mm.block; - -import com.ticticboooom.mods.mm.block.tile.ControllerBlockEntity; -import com.ticticboooom.mods.mm.block.tile.StructureGenBlockEntity; -import com.ticticboooom.mods.mm.registration.MMSetup; -import net.minecraft.block.*; -import net.minecraft.block.material.Material; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.InventoryHelper; -import net.minecraft.item.BlockItemUseContext; -import net.minecraft.state.DirectionProperty; -import net.minecraft.state.StateContainer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.util.math.shapes.IBooleanFunction; -import net.minecraft.util.math.shapes.ISelectionContext; -import net.minecraft.util.math.shapes.VoxelShape; -import net.minecraft.util.math.shapes.VoxelShapes; -import net.minecraft.world.IBlockReader; -import net.minecraft.world.World; -import net.minecraftforge.common.ToolType; -import net.minecraftforge.fml.network.NetworkHooks; - -import javax.annotation.Nullable; -import java.util.stream.Stream; - -public class StructureGenBlock extends Block { - private static final DirectionProperty FACING = HorizontalBlock.HORIZONTAL_FACING; - - private static final VoxelShape SHAPE_N = Stream.of( - Block.makeCuboidShape(1, 2, 1, 15, 5, 6), - Block.makeCuboidShape(0, 0, 0, 16, 2, 16), - Block.makeCuboidShape(0.5, 2, 6.5, 15.5, 5, 15.5), - Block.makeCuboidShape(0, 5, 6, 16, 6, 16), - Block.makeCuboidShape(4, 6, 7, 15, 14, 13), - Block.makeCuboidShape(1, 5.5, 7, 3, 6.5, 9), - Block.makeCuboidShape(1.25, 11, 7.25, 2.75, 11.25, 8.75), - Block.makeCuboidShape(1, 6, 11, 3, 12.25, 14), - Block.makeCuboidShape(1, 11.25, 6.75, 3, 12.25, 11.25), - Block.makeCuboidShape(0, 2, 0, 1, 3, 6), - Block.makeCuboidShape(15, 2, 0, 16, 3, 6), - Block.makeCuboidShape(0, 2, 6, 1, 5, 7), - Block.makeCuboidShape(15, 2, 6, 16, 5, 7), - Block.makeCuboidShape(15, 2, 15, 16, 5, 16), - Block.makeCuboidShape(0, 2, 15, 1, 5, 16) - ).reduce((v1, v2) -> VoxelShapes.combineAndSimplify(v1, v2, IBooleanFunction.OR)).get(); - - private static final VoxelShape SHAPE_E = Stream.of( - Block.makeCuboidShape(10, 2, 1, 15, 5, 15), - Block.makeCuboidShape(0, 0, 0, 16, 2, 16), - Block.makeCuboidShape(0.5, 2, 0.5, 9.5, 5, 15.5), - Block.makeCuboidShape(0, 5, 0, 10, 6, 16), - Block.makeCuboidShape(3, 6, 4, 9, 14, 15), - Block.makeCuboidShape(7, 5.5, 1, 9, 6.5, 3), - Block.makeCuboidShape(7.25, 11, 1.25, 8.75, 11.25, 2.75), - Block.makeCuboidShape(2, 6, 1, 5, 12.25, 3), - Block.makeCuboidShape(4.75, 11.25, 1, 9.25, 12.25, 3), - Block.makeCuboidShape(10, 2, 0, 16, 3, 1), - Block.makeCuboidShape(10, 2, 15, 16, 3, 16), - Block.makeCuboidShape(9, 2, 0, 10, 5, 1), - Block.makeCuboidShape(9, 2, 15, 10, 5, 16), - Block.makeCuboidShape(0, 2, 15, 1, 5, 16), - Block.makeCuboidShape(0, 2, 0, 1, 5, 1) - ).reduce((v1, v2) -> VoxelShapes.combineAndSimplify(v1, v2, IBooleanFunction.OR)).get(); - - private static final VoxelShape SHAPE_S = Stream.of( - Block.makeCuboidShape(1, 2, 10, 15, 5, 15), - Block.makeCuboidShape(0, 0, 0, 16, 2, 16), - Block.makeCuboidShape(0.5, 2, 0.5, 15.5, 5, 9.5), - Block.makeCuboidShape(0, 5, 0, 16, 6, 10), - Block.makeCuboidShape(1, 6, 3, 12, 14, 9), - Block.makeCuboidShape(13, 5.5, 7, 15, 6.5, 9), - Block.makeCuboidShape(13.25, 11, 7.25, 14.75, 11.25, 8.75), - Block.makeCuboidShape(13, 6, 2, 15, 12.25, 5), - Block.makeCuboidShape(13, 11.25, 4.75, 15, 12.25, 9.25), - Block.makeCuboidShape(15, 2, 10, 16, 3, 16), - Block.makeCuboidShape(0, 2, 10, 1, 3, 16), - Block.makeCuboidShape(15, 2, 9, 16, 5, 10), - Block.makeCuboidShape(0, 2, 9, 1, 5, 10), - Block.makeCuboidShape(0, 2, 0, 1, 5, 1), - Block.makeCuboidShape(15, 2, 0, 16, 5, 1) - ).reduce((v1, v2) -> VoxelShapes.combineAndSimplify(v1, v2, IBooleanFunction.OR)).get(); - - private static final VoxelShape SHAPE_W = Stream.of( - Block.makeCuboidShape(1, 2, 1, 6, 5, 15), - Block.makeCuboidShape(0, 0, 0, 16, 2, 16), - Block.makeCuboidShape(6.5, 2, 0.5, 15.5, 5, 15.5), - Block.makeCuboidShape(6, 5, 0, 16, 6, 16), - Block.makeCuboidShape(7, 6, 1, 13, 14, 12), - Block.makeCuboidShape(7, 5.5, 13, 9, 6.5, 15), - Block.makeCuboidShape(7.25, 11, 13.25, 8.75, 11.25, 14.75), - Block.makeCuboidShape(11, 6, 13, 14, 12.25, 15), - Block.makeCuboidShape(6.75, 11.25, 13, 11.25, 12.25, 15), - Block.makeCuboidShape(0, 2, 15, 6, 3, 16), - Block.makeCuboidShape(0, 2, 0, 6, 3, 1), - Block.makeCuboidShape(6, 2, 15, 7, 5, 16), - Block.makeCuboidShape(6, 2, 0, 7, 5, 1), - Block.makeCuboidShape(15, 2, 0, 16, 5, 1), - Block.makeCuboidShape(15, 2, 15, 16, 5, 16) - ).reduce((v1, v2) -> VoxelShapes.combineAndSimplify(v1, v2, IBooleanFunction.OR)).get(); - - public StructureGenBlock() { - super(AbstractBlock.Properties.create(Material.IRON).setRequiresTool().hardnessAndResistance(5.0F, 6.0F).sound(SoundType.METAL).harvestLevel(0) - .harvestTool(ToolType.PICKAXE)); - this.setDefaultState(this.getDefaultState().with(FACING, Direction.NORTH)); - } - - @Override - protected void fillStateContainer(StateContainer.Builder builder) { - super.fillStateContainer(builder.add(FACING)); - } - - @Override - public ActionResultType onBlockActivated(BlockState state, World level, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult traceResult) { - if (!level.isRemote()) { - TileEntity blockEntity = level.getTileEntity(pos); - if (blockEntity instanceof StructureGenBlockEntity) { - NetworkHooks.openGui(((ServerPlayerEntity) player), (StructureGenBlockEntity)blockEntity, pos); - } - } - return ActionResultType.SUCCESS; - } - - @Override - public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { - if (!state.matchesBlock(newState.getBlock())) { - TileEntity tileentity = worldIn.getTileEntity(pos); - if (tileentity instanceof StructureGenBlockEntity) { - InventoryHelper.dropInventoryItems(worldIn, pos, ((StructureGenBlockEntity) tileentity).getInv()); - worldIn.updateComparatorOutputLevel(pos, this); - } - - super.onReplaced(state, worldIn, pos, newState, isMoving); - } - } - - @Nullable - @Override - public BlockState getStateForPlacement(BlockItemUseContext ctx) { - return this.getDefaultState().with(FACING, ctx.getPlacementHorizontalFacing().getOpposite()); - } - - @Override - public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, ISelectionContext p_220053_4_) { - switch (state.get(FACING)) { - case NORTH: - return SHAPE_N; - case EAST: - return SHAPE_E; - case SOUTH: - return SHAPE_S; - case WEST: - return SHAPE_W; - default: - throw new IllegalStateException("Invalid State"); - } - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Nullable - @Override - public TileEntity createTileEntity(BlockState state, IBlockReader world) { - return MMSetup.STRUCTURE_TILE.get().create(); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/block/container/ControllerBlockContainer.java b/src/main/java/com/ticticboooom/mods/mm/block/container/ControllerBlockContainer.java deleted file mode 100644 index 5609054..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/block/container/ControllerBlockContainer.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.ticticboooom.mods.mm.block.container; - -import com.ticticboooom.mods.mm.block.tile.ControllerBlockEntity; -import lombok.Getter; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.container.Container; -import net.minecraft.inventory.container.ContainerType; -import net.minecraft.inventory.container.Slot; -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketBuffer; - -import javax.annotation.Nullable; - -public class ControllerBlockContainer extends Container { - - @Getter - private ControllerBlockEntity tile; - - public ControllerBlockContainer(@Nullable ContainerType p_i50105_1_, int windowId, PlayerInventory inv, ControllerBlockEntity tile) { - super(p_i50105_1_, windowId); - this.tile = tile; - int playerOffsetX = 8; - int playerOffsetY = 121; - for (int j = 0; j < 3; j++) { - for (int i = 0; i < 9; i++) { - this.addSlot(new Slot(inv, 9 + (j * 9 + i), i* 18 + playerOffsetX, j* 18 + playerOffsetY)); - } - } - - for (int i = 0; i < 9; i++) { - this.addSlot(new Slot(inv, i,8 + (i * 18), 179)); - } - } - - public ControllerBlockContainer(ContainerType container, int windowId, PlayerInventory player, PacketBuffer buf) { - this(container, windowId, player, (ControllerBlockEntity) player.player.world.getTileEntity(buf.readBlockPos())); - } - - - - @Override - public boolean canInteractWith(PlayerEntity p_75145_1_) { - return true; - } - - - @Override - public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) { - return ItemStack.EMPTY; - } - -} diff --git a/src/main/java/com/ticticboooom/mods/mm/block/container/PortBlockContainer.java b/src/main/java/com/ticticboooom/mods/mm/block/container/PortBlockContainer.java deleted file mode 100644 index 43d7d1d..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/block/container/PortBlockContainer.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.ticticboooom.mods.mm.block.container; - -import com.ticticboooom.mods.mm.block.tile.IMachinePortTile; -import lombok.Getter; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.container.Container; -import net.minecraft.inventory.container.ContainerType; -import net.minecraft.inventory.container.Slot; -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketBuffer; -import net.minecraftforge.items.ItemStackHandler; - -import javax.annotation.Nullable; - -public class PortBlockContainer extends Container { - - private final PlayerInventory inv; - @Getter - private IMachinePortTile tile; - - public PortBlockContainer(@Nullable ContainerType p_i50105_1_, int windowId, PlayerInventory inv, IMachinePortTile tile) { - super(p_i50105_1_, windowId); - this.inv = inv; - tile.getStorage().setupContainer(this, inv, tile); - this.tile = tile; - } - - public PortBlockContainer(ContainerType container, int windowId, PlayerInventory player, PacketBuffer buf) { - this(container, windowId, player, (IMachinePortTile) player.player.world.getTileEntity(buf.readBlockPos())); - } - - @Override - public boolean canInteractWith(PlayerEntity p_75145_1_) { - return true; - } - - @Override - public Slot addSlot(Slot p_75146_1_) { - return super.addSlot(p_75146_1_); - } - - @Override - public ItemStack transferStackInSlot(PlayerEntity p_82846_1_, int index) { - ItemStack itemStack = ItemStack.EMPTY; - Object o = tile.getStorage().getLO().orElse(null); - if (o instanceof ItemStackHandler) { - ItemStackHandler handler = ((ItemStackHandler) o); - Slot slot = this.getSlot(index); - if (slot.getHasStack()) { - ItemStack itemStack1 = slot.getStack(); - itemStack = itemStack1.copy(); - if (index < handler.getSlots()) { - if (!this.mergeItemStack(itemStack1, handler.getSlots(), this.inventorySlots.size(), true)) { - return ItemStack.EMPTY; - } - } else if (!this.mergeItemStack(itemStack1, 0, handler.getSlots(), false)) { - return ItemStack.EMPTY; - } - - if (itemStack1.isEmpty()) { - slot.putStack(ItemStack.EMPTY); - } else { - slot.onSlotChanged(); - } - } - } - return itemStack; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/block/container/ProjectorBlockContainer.java b/src/main/java/com/ticticboooom/mods/mm/block/container/ProjectorBlockContainer.java deleted file mode 100644 index 1b60efc..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/block/container/ProjectorBlockContainer.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.ticticboooom.mods.mm.block.container; - -import com.ticticboooom.mods.mm.block.tile.ProjectorBlockEntity; -import com.ticticboooom.mods.mm.registration.MMSetup; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.container.Container; -import net.minecraft.network.PacketBuffer; - -public class ProjectorBlockContainer extends Container { - private ProjectorBlockEntity tile; - - public ProjectorBlockContainer(int windowId, ProjectorBlockEntity tile) { - super(MMSetup.PROJECTOR_CONTAINER.get(), windowId); - this.tile = tile; - } - - @Override - public boolean canInteractWith(PlayerEntity p_75145_1_) { - return true; - } - - public ProjectorBlockContainer(int w, PlayerInventory inv, PacketBuffer buf) { - this(w, (ProjectorBlockEntity) inv.player.world.getTileEntity(buf.readBlockPos())); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/block/container/StructureGenBlockContainer.java b/src/main/java/com/ticticboooom/mods/mm/block/container/StructureGenBlockContainer.java deleted file mode 100644 index a7e8ee3..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/block/container/StructureGenBlockContainer.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.ticticboooom.mods.mm.block.container; - -import com.ticticboooom.mods.mm.block.container.slot.StructureDeviceSlot; -import com.ticticboooom.mods.mm.block.tile.ProjectorBlockEntity; -import com.ticticboooom.mods.mm.block.tile.StructureGenBlockEntity; -import com.ticticboooom.mods.mm.registration.MMSetup; -import lombok.Getter; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.container.Container; -import net.minecraft.inventory.container.Slot; -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketBuffer; -import net.minecraftforge.items.ItemStackHandler; - -public class StructureGenBlockContainer extends Container { - @Getter - private StructureGenBlockEntity tile; - - public StructureGenBlockContainer(int windowId, PlayerInventory inv, StructureGenBlockEntity tile) { - super(MMSetup.STRUCTURE_CONTAINER.get(), windowId); - this.tile = tile; - - this.addSlot(new StructureDeviceSlot(tile.getInv(), 0, 151, -14)); - - this.tile = tile; - int playerOffsetX = 8; - int playerOffsetY = 121; - for (int j = 0; j < 3; j++) { - for (int i = 0; i < 9; i++) { - this.addSlot(new Slot(inv, 9 + (j * 9 + i), i * 18 + playerOffsetX, j * 18 + playerOffsetY)); - } - } - - for (int i = 0; i < 9; i++) { - this.addSlot(new Slot(inv, i, 8 + (i * 18), 179)); - } - } - - @Override - public boolean canInteractWith(PlayerEntity p_75145_1_) { - return true; - } - - public StructureGenBlockContainer(int w, PlayerInventory inv, PacketBuffer buf) { - this(w, inv, (StructureGenBlockEntity) inv.player.world.getTileEntity(buf.readBlockPos())); - } - - @Override - public ItemStack transferStackInSlot(PlayerEntity p_82846_1_, int index) { - ItemStack itemStack = ItemStack.EMPTY; - Slot slot = this.getSlot(index); - if (slot.getHasStack()) { - ItemStack itemStack1 = slot.getStack(); - itemStack = itemStack1.copy(); - if (index < 1) { - if (!this.mergeItemStack(itemStack1, 1, this.inventorySlots.size(), true)) { - return ItemStack.EMPTY; - } - } else if (!this.mergeItemStack(itemStack1, 0, 1, false)) { - return ItemStack.EMPTY; - } - - if (itemStack1.isEmpty()) { - slot.putStack(ItemStack.EMPTY); - } else { - slot.onSlotChanged(); - } - } - return itemStack; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/block/container/slot/StructureDeviceSlot.java b/src/main/java/com/ticticboooom/mods/mm/block/container/slot/StructureDeviceSlot.java deleted file mode 100644 index 3ee4662..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/block/container/slot/StructureDeviceSlot.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.ticticboooom.mods.mm.block.container.slot; - -import com.ticticboooom.mods.mm.registration.MMSetup; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.container.Slot; -import net.minecraft.item.ItemStack; - -public class StructureDeviceSlot extends Slot { - public StructureDeviceSlot(IInventory inventoryIn, int index, int xPosition, int yPosition) { - super(inventoryIn, index, xPosition, yPosition); - } - - @Override - public boolean isItemValid(ItemStack stack) { - return stack.getItem() == MMSetup.STRUCTURE_DEVICE.get(); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/block/tile/AstralMachineInputPortBlockEntity.java b/src/main/java/com/ticticboooom/mods/mm/block/tile/AstralMachineInputPortBlockEntity.java deleted file mode 100644 index 6090846..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/block/tile/AstralMachineInputPortBlockEntity.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.ticticboooom.mods.mm.block.tile; - -import com.ticticboooom.mods.mm.block.container.PortBlockContainer; -import com.ticticboooom.mods.mm.inventory.as.MMSimpleTransmissionReceiver; -import com.ticticboooom.mods.mm.network.PacketHandler; -import com.ticticboooom.mods.mm.network.packets.TileClientUpdatePacket; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import hellfirepvp.astralsorcery.common.constellation.ConstellationTile; -import hellfirepvp.astralsorcery.common.constellation.IMinorConstellation; -import hellfirepvp.astralsorcery.common.constellation.IWeakConstellation; -import hellfirepvp.astralsorcery.common.tile.base.network.TileReceiverBase; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.container.Container; -import net.minecraft.inventory.container.ContainerType; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; -import net.minecraftforge.fml.network.PacketDistributor; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -public class AstralMachineInputPortBlockEntity extends TileReceiverBase implements IMachinePortTile { - public AstralMachineInputPortBlockEntity(TileEntityType tileEntityTypeIn, ContainerType cont, PortStorage storage) { - super(tileEntityTypeIn); - this.cont = cont; - this.storage = storage; - markForUpdate(); - } - - @Override - public void tick() { - super.tick(); - if (!world.isRemote()) { - PacketHandler.INSTANCE.send(PacketDistributor.ALL.noArg(), new TileClientUpdatePacket.Data(pos, write(new CompoundNBT()))); - } - } - - private ContainerType cont; - PortStorage storage; - - @Override - public void writeCustomNBT(CompoundNBT nbt) { - nbt.put("inv", storage.save(new CompoundNBT())); - super.writeCustomNBT(nbt); - } - - @Override - public void read(BlockState state, CompoundNBT nbt) { - super.read(state, nbt); - storage.load(nbt.getCompound("inv")); - } - - @Override - public PortStorage getStorage() { - return this.storage; - } - - @Override - public boolean isInput() { - return true; - } - - @Override - public ITextComponent getDisplayName() { - return new StringTextComponent("Port"); - } - - @Nullable - @Override - public Container createMenu(int p_createMenu_1_, PlayerInventory p_createMenu_2_, PlayerEntity p_createMenu_3_) { - return new PortBlockContainer(cont, p_createMenu_1_, p_createMenu_2_, this); - } - - @Override - public void onBreak() { - super.onBreak(); - } - - @Override - protected void invalidateCaps() { - this.onBreak(); - } - - @Nonnull - @Override - public MMSimpleTransmissionReceiver provideEndpoint(BlockPos blockPos) { - return new MMSimpleTransmissionReceiver(blockPos); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/block/tile/AstralMachinePortBlockEntity.java b/src/main/java/com/ticticboooom/mods/mm/block/tile/AstralMachinePortBlockEntity.java deleted file mode 100644 index 8234b0b..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/block/tile/AstralMachinePortBlockEntity.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.ticticboooom.mods.mm.block.tile; - -import com.ticticboooom.mods.mm.block.container.PortBlockContainer; -import com.ticticboooom.mods.mm.inventory.as.MMIndependentStarlightSource; -import com.ticticboooom.mods.mm.network.PacketHandler; -import com.ticticboooom.mods.mm.network.packets.TileClientUpdatePacket; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import hellfirepvp.astralsorcery.common.constellation.ConstellationTile; -import hellfirepvp.astralsorcery.common.constellation.IMinorConstellation; -import hellfirepvp.astralsorcery.common.constellation.IWeakConstellation; -import hellfirepvp.astralsorcery.common.starlight.IIndependentStarlightSource; -import hellfirepvp.astralsorcery.common.starlight.transmission.base.SimpleTransmissionSourceNode; -import hellfirepvp.astralsorcery.common.tile.base.network.TileSourceBase; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.container.Container; -import net.minecraft.inventory.container.ContainerType; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.ITickableTileEntity; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; -import net.minecraftforge.fml.network.PacketDistributor; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -public class AstralMachinePortBlockEntity extends TileSourceBase implements IMachinePortTile, ConstellationTile { - public AstralMachinePortBlockEntity(TileEntityType tileEntityTypeIn, ContainerType cont, PortStorage storage) { - super(tileEntityTypeIn); - this.cont = cont; - this.storage = storage; - } - - @Override - public void tick() { - super.tick(); - if (!world.isRemote()) { - PacketHandler.INSTANCE.send(PacketDistributor.ALL.noArg(), new TileClientUpdatePacket.Data(pos, write(new CompoundNBT()))); - } - } - - private ContainerType cont; - PortStorage storage; - IWeakConstellation constellationType = null; - IMinorConstellation traitConstellationType = null; - - @Nonnull - @Override - public IIndependentStarlightSource provideNewSourceNode() { - return new MMIndependentStarlightSource(); - } - - @Nonnull - @Override - public SimpleTransmissionSourceNode provideSourceNode(BlockPos blockPos) { - return new SimpleTransmissionSourceNode(blockPos); - } - - - @Override - public void writeCustomNBT(CompoundNBT nbt) { - nbt.put("inv", storage.save(new CompoundNBT())); - super.writeCustomNBT(nbt); - } - - @Override - public void read(BlockState state, CompoundNBT nbt) { - super.read(state, nbt); - storage.load(nbt.getCompound("inv")); - } - - @Override - public PortStorage getStorage() { - return this.storage; - } - - @Override - public boolean isInput() { - return false; - } - - @Override - public ITextComponent getDisplayName() { - return new StringTextComponent("Port"); - } - - @Nullable - @Override - public Container createMenu(int p_createMenu_1_, PlayerInventory p_createMenu_2_, PlayerEntity p_createMenu_3_) { - return new PortBlockContainer(cont, p_createMenu_1_, p_createMenu_2_, this); - } - - @Override - public IWeakConstellation getAttunedConstellation() { - return constellationType; - } - - @Override - public boolean setAttunedConstellation(IWeakConstellation cst) { - if (cst != this.constellationType) { - markForUpdate(); - } - constellationType = cst; - return true; - } - - @Override - public IMinorConstellation getTraitConstellation() { - return traitConstellationType; - } - - @Override - public boolean setTraitConstellation(IMinorConstellation tst) { - if (tst != this.traitConstellationType) { - markForUpdate(); - } - traitConstellationType = tst; - return true; - } - - @Override - public boolean tryUnlink(PlayerEntity player, BlockPos other) { - boolean i = super.tryUnlink(player, other); - markForUpdate(); - return i; - } - - @Override - public void onBreak() { - super.onBreak(); - } - - @Override - protected void invalidateCaps() { - this.onBreak(); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/block/tile/ControllerBlockEntity.java b/src/main/java/com/ticticboooom/mods/mm/block/tile/ControllerBlockEntity.java deleted file mode 100644 index ca1662b..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/block/tile/ControllerBlockEntity.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.ticticboooom.mods.mm.block.tile; - -import com.ticticboooom.mods.mm.block.container.ControllerBlockContainer; -import com.ticticboooom.mods.mm.data.MachineProcessRecipe; -import com.ticticboooom.mods.mm.data.MachineStructureRecipe; -import com.ticticboooom.mods.mm.model.ProcessUpdate; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import com.ticticboooom.mods.mm.registration.RecipeTypes; -import lombok.Getter; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.container.Container; -import net.minecraft.inventory.container.ContainerType; -import net.minecraft.inventory.container.INamedContainerProvider; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.ITickableTileEntity; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraftforge.fml.RegistryObject; - -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; - -public class ControllerBlockEntity extends UpdatableTile implements ITickableTileEntity, INamedContainerProvider { - - - private RegistryObject> container; - private String controllerId; - @Getter - private ProcessUpdate update = new ProcessUpdate(0, "", "", "", new ArrayList<>()); - - public ControllerBlockEntity(RegistryObject> type, RegistryObject> container, String controllerId) { - super(type.get()); - this.container = container; - this.controllerId = controllerId; - } - - @Override - public void tick() { - if (world.isRemote()){ - return; - } - update.setMsg("Failed to construct \nthe machine"); - List recipes = world.getRecipeManager().getRecipesForType(RecipeTypes.MACHINE_STRUCTURE); - for (MachineStructureRecipe recipe : recipes) { - int index = recipe.matches(this.pos, world, controllerId); - if (index != -1) { - if (!update.getSid().equals(recipe.getId().toString())){ - update.setTicksTaken(0); - } - update.setSid(recipe.getId().toString()); - update.setMsg("Found structure"); - onStructureFound(recipe, index); - break; - } - } - update(); - } - - private void onStructureFound(MachineStructureRecipe structure, int index) { - ArrayList ports = structure.getPorts(pos, world, index); - List inputPorts = new ArrayList<>(); - List outputPorts = new ArrayList<>(); - for (BlockPos port : ports) { - TileEntity blockEntity = world.getTileEntity(port); - if (blockEntity instanceof IMachinePortTile) { - IMachinePortTile portBE = (IMachinePortTile) blockEntity; - - if (portBE.isInput()) { - inputPorts.add(portBE.getStorage()); - } else { - outputPorts.add(portBE.getStorage()); - } - } - } - - onPortsEstablished(inputPorts, outputPorts, structure); - } - - private void onPortsEstablished(List inputPorts, List outputPorts, MachineStructureRecipe structure) { - List processRecipes = world.getRecipeManager().getRecipesForType(RecipeTypes.MACHINE_PROCESS); - boolean processed = false; - for (MachineProcessRecipe recipe : processRecipes) { - if (recipe.matches(inputPorts, structure.getStructureId(), update)) { - if (!update.getId().equals(recipe.getId().toString())){ - update.setTicksTaken(0); - } - this.update.setId(recipe.getId().toString()); - this.update = recipe.process(inputPorts, outputPorts, this.update); - processed = true; - break; - } - } - if (!processed) { - this.update.setTicksTaken(0); - } - } - - - @Override - public ITextComponent getDisplayName() { - return new TranslationTextComponent("container.masterfulmachinery." + this.controllerId + "_controller.name"); - } - - @Nullable - @Override - public Container createMenu(int p_createMenu_1_, PlayerInventory p_createMenu_2_, PlayerEntity p_createMenu_3_) { - return new ControllerBlockContainer(container.get(), p_createMenu_1_, p_createMenu_2_, this); - } - - @Override - public CompoundNBT write(CompoundNBT nbt) { - nbt.putInt("ticks", update.getTicksTaken()); - nbt.putString("msg", update.getMsg()); - return super.write(nbt); - } - - @Override - public void read(BlockState p_230337_1_, CompoundNBT nbt) { - super.read(p_230337_1_, nbt); - update.setTicksTaken(nbt.getInt("ticks")); - update.setMsg(nbt.getString("msg")); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/block/tile/IMachinePortTile.java b/src/main/java/com/ticticboooom/mods/mm/block/tile/IMachinePortTile.java deleted file mode 100644 index ca12fa4..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/block/tile/IMachinePortTile.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.ticticboooom.mods.mm.block.tile; - -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import net.minecraft.inventory.container.INamedContainerProvider; - -public interface IMachinePortTile extends INamedContainerProvider { - PortStorage getStorage(); - boolean isInput(); -} diff --git a/src/main/java/com/ticticboooom/mods/mm/block/tile/MachinePortBlockEntity.java b/src/main/java/com/ticticboooom/mods/mm/block/tile/MachinePortBlockEntity.java deleted file mode 100644 index f1c14ad..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/block/tile/MachinePortBlockEntity.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.ticticboooom.mods.mm.block.tile; - -import com.ticticboooom.mods.mm.block.container.PortBlockContainer; -import com.ticticboooom.mods.mm.ports.storage.ManaPortStorage; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import lombok.Getter; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.container.Container; -import net.minecraft.inventory.container.ContainerType; -import net.minecraft.inventory.container.INamedContainerProvider; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.ITickableTileEntity; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.Direction; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.util.LazyOptional; -import vazkii.botania.api.mana.IManaBlock; -import vazkii.botania.api.mana.IManaPool; -import vazkii.botania.api.mana.IManaReceiver; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -public class MachinePortBlockEntity extends UpdatableTile implements ITickableTileEntity, IMachinePortTile { - - protected ContainerType container; - @Getter - protected PortStorage storage; - @Getter - protected boolean input; - - - public MachinePortBlockEntity(TileEntityType p_i48289_1_, ContainerType container, PortStorage storage, boolean input) { - super(p_i48289_1_); - this.container = container; - this.storage = storage; - this.input = input; - } - - @Nonnull - @Override - public LazyOptional getCapability(@Nonnull Capability cap, @Nullable Direction side) { - if (storage.validate(cap)){ - return storage.getLO(); - } - return super.getCapability(cap, side); - } - - @Override - public CompoundNBT write(CompoundNBT nbt) { - nbt.put("inv", storage.save(new CompoundNBT())); - return super.write(nbt); - } - - @Override - public void read(BlockState state, CompoundNBT nbt) { - super.read(state, nbt); - storage.load(nbt.getCompound("inv")); - } - - @Override - public ITextComponent getDisplayName() { - return new StringTextComponent("Port"); - } - - @Nullable - @Override - public Container createMenu(int windowsId, PlayerInventory inv, PlayerEntity player) { - return new PortBlockContainer(container, windowsId, inv,this); - } - - @Override - public void tick() { - if (world.isRemote()){ - return; - } - this.getStorage().tick(this); - update(); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/block/tile/ManaMachinePortBlockEntity.java b/src/main/java/com/ticticboooom/mods/mm/block/tile/ManaMachinePortBlockEntity.java deleted file mode 100644 index 00edf60..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/block/tile/ManaMachinePortBlockEntity.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.ticticboooom.mods.mm.block.tile; - -import com.ticticboooom.mods.mm.ports.storage.ManaPortStorage; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import net.minecraft.inventory.container.ContainerType; -import net.minecraft.item.DyeColor; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntityType; -import vazkii.botania.api.mana.IManaBlock; -import vazkii.botania.api.mana.IManaPool; -import vazkii.botania.api.mana.IManaSpreader; -import vazkii.botania.api.mana.spark.ISparkAttachable; -import vazkii.botania.api.mana.spark.ISparkEntity; - -public class ManaMachinePortBlockEntity extends MachinePortBlockEntity implements IManaPool, ISparkAttachable { - - private ISparkEntity spark; - - public ManaMachinePortBlockEntity(TileEntityType p_i48289_1_, ContainerType container, PortStorage storage, boolean input) { - super(p_i48289_1_, container, storage, input); - } - - @Override - public boolean isFull() { - if (storage instanceof ManaPortStorage) { - ManaPortStorage s = (ManaPortStorage) storage; - return s.getInv().getManaStored() >= s.getInv().getMaxManaStored(); - } - return true; - } - - @Override - public void receiveMana(int mana) { - if (storage instanceof ManaPortStorage) { - ManaPortStorage s = (ManaPortStorage) storage; - if (mana > 0) { - s.getInv().receiveMana(mana, false); - } else { - s.getInv().extractMana(-mana, false); - } - } - } - - @Override - public boolean canReceiveManaFromBursts() { - return this.isInput(); - } - - @Override - public int getCurrentMana() { - if (storage instanceof ManaPortStorage) { - ManaPortStorage s = (ManaPortStorage) storage; - return s.getInv().getManaStored(); - } - return 0; - } - - @Override - public boolean isOutputtingPower() { - return !this.input; - } - - @Override - public DyeColor getColor() { - return DyeColor.GRAY; - } - - @Override - public void setColor(DyeColor color) { - - } - - @Override - public boolean canAttachSpark(ItemStack stack) { - return true; - } - - @Override - public void attachSpark(ISparkEntity entity) { - spark = entity; - } - - @Override - public int getAvailableSpaceForMana() { - if (storage instanceof ManaPortStorage) { - ManaPortStorage s = (ManaPortStorage) storage; - return s.getInv().getMaxManaStored() - s.getInv().getManaStored(); - } - return 0; - } - - @Override - public ISparkEntity getAttachedSpark() { - return spark; - } - - @Override - public boolean areIncomingTranfersDone() { - return false; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/block/tile/ProjectorBlockEntity.java b/src/main/java/com/ticticboooom/mods/mm/block/tile/ProjectorBlockEntity.java deleted file mode 100644 index fc37eff..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/block/tile/ProjectorBlockEntity.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.ticticboooom.mods.mm.block.tile; - -import com.ticticboooom.mods.mm.registration.MMSetup; -import net.minecraft.tileentity.TileEntity; - -public class ProjectorBlockEntity extends TileEntity { - public ProjectorBlockEntity() { - super(MMSetup.PROJECTOR_TILE.get()); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/block/tile/RotationGenMachinePortBlockEntity.java b/src/main/java/com/ticticboooom/mods/mm/block/tile/RotationGenMachinePortBlockEntity.java deleted file mode 100644 index 203e1ee..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/block/tile/RotationGenMachinePortBlockEntity.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.ticticboooom.mods.mm.block.tile; - -import com.simibubi.create.content.contraptions.KineticNetwork; -import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity; -import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.ticticboooom.mods.mm.block.container.PortBlockContainer; -import com.ticticboooom.mods.mm.network.PacketHandler; -import com.ticticboooom.mods.mm.network.packets.TileClientUpdatePacket; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import com.ticticboooom.mods.mm.ports.storage.RotationPortStorage; -import lombok.Getter; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.container.Container; -import net.minecraft.inventory.container.ContainerType; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.ITickableTileEntity; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraftforge.fml.network.PacketDistributor; - -import javax.annotation.Nullable; - -public class RotationGenMachinePortBlockEntity extends GeneratingKineticTileEntity implements IMachinePortTile, ITickableTileEntity { - private final ContainerType container; - @Getter - private final PortStorage storage; - @Getter - private boolean input; - - public RotationGenMachinePortBlockEntity(TileEntityType typeIn, ContainerType container, PortStorage storage, boolean input) { - super(typeIn); - this.container = container; - this.storage = storage; - this.input = input; - if (input) { - this.stress = ((RotationPortStorage) storage).getStress(); - } - - } - - @Override - public ITextComponent getDisplayName() { - return new TranslationTextComponent("container.masterfulmachinery.create_rotation"); - } - - @Nullable - @Override - public Container createMenu(int p_createMenu_1_, PlayerInventory p_createMenu_2_, PlayerEntity p_createMenu_3_) { - return new PortBlockContainer(container, p_createMenu_1_, p_createMenu_2_, this); - } - - @Override - public void tick() { - this.reActivateSource = true; - super.tick(); - this.storage.tick(this); -// if (storage instanceof RotationPortStorage) { -// RotationPortStorage stor = (RotationPortStorage) this.storage; -// float prev = this.speed; -// float speed = stor.getSpeed(); -// if (speed != prev) { -// if (!hasSource()) { -// effects.queueRotationIndicators(); -// } -// applyNewSpeed(prev, speed); -// } -// if (hasNetwork() && speed != 0) { -// KineticNetwork network = getOrCreateNetwork(); -// notifyStressCapacityChange(calculateAddedStressCapacity()); -// getOrCreateNetwork().updateCapacityFor(this, calculateStressApplied()); -// network.updateStress(); -// } -// -// onSpeedChanged(prev); -// sendData(); -// } - - if (!world.isRemote()) { - PacketHandler.INSTANCE.send(PacketDistributor.ALL.noArg(), new TileClientUpdatePacket.Data(pos, write(new CompoundNBT()))); - } - } - - @Override - protected void fromTag(BlockState state, CompoundNBT compound, boolean clientPacket) { - this.storage.load(compound.getCompound("inv")); - } - - @Override - protected void write(CompoundNBT compound, boolean clientPacket) { - compound.put("inv", this.storage.save(new CompoundNBT())); - super.write(compound, clientPacket); - } - - - @Override - public float getGeneratedSpeed() { - if (storage instanceof RotationPortStorage) { - RotationPortStorage stor = (RotationPortStorage) this.storage; - return stor.getSpeed(); - } - return 0; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/block/tile/RotationMachinePortBlockEntity.java b/src/main/java/com/ticticboooom/mods/mm/block/tile/RotationMachinePortBlockEntity.java deleted file mode 100644 index 4b6dd1b..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/block/tile/RotationMachinePortBlockEntity.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.ticticboooom.mods.mm.block.tile; - -import com.simibubi.create.Create; -import com.simibubi.create.content.contraptions.KineticNetwork; -import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.ticticboooom.mods.mm.block.container.PortBlockContainer; -import com.ticticboooom.mods.mm.network.PacketHandler; -import com.ticticboooom.mods.mm.network.packets.TileClientUpdatePacket; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import com.ticticboooom.mods.mm.ports.storage.RotationPortStorage; -import lombok.Getter; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.container.Container; -import net.minecraft.inventory.container.ContainerType; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.ITickableTileEntity; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraftforge.fml.network.PacketDistributor; - -import javax.annotation.Nullable; - -public class RotationMachinePortBlockEntity extends KineticTileEntity implements IMachinePortTile, ITickableTileEntity { - private final ContainerType container; - @Getter - private final PortStorage storage; - @Getter - private boolean input; - - public RotationMachinePortBlockEntity(TileEntityType typeIn, ContainerType container, PortStorage storage, boolean input) { - super(typeIn); - this.container = container; - this.storage = storage; - this.input = input; - if (input) { - this.stress = ((RotationPortStorage) storage).getStress(); - } - - } - - @Override - public ITextComponent getDisplayName() { - return new TranslationTextComponent("container.masterfulmachinery.create_rotation"); - } - - @Nullable - @Override - public Container createMenu(int p_createMenu_1_, PlayerInventory p_createMenu_2_, PlayerEntity p_createMenu_3_) { - return new PortBlockContainer(container, p_createMenu_1_, p_createMenu_2_, this); - } - - @Override - public void tick() { - super.tick(); - - if (this.world.isRemote) { - return; - } - if (storage instanceof RotationPortStorage) { - RotationPortStorage storage = (RotationPortStorage) this.storage; - if (input) { - storage.setSpeed(Math.abs(getSpeed())); - } - } - if (!world.isRemote()) { - PacketHandler.INSTANCE.send(PacketDistributor.ALL.noArg(), new TileClientUpdatePacket.Data(pos, write(new CompoundNBT()))); - } - } - - @Override - protected void fromTag(BlockState state, CompoundNBT compound, boolean clientPacket) { - this.storage.load(compound.getCompound("inv")); - } - - @Override - protected void write(CompoundNBT compound, boolean clientPacket) { - compound.put("inv", this.storage.save(new CompoundNBT())); - super.write(compound, clientPacket); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/block/tile/StructureGenBlockEntity.java b/src/main/java/com/ticticboooom/mods/mm/block/tile/StructureGenBlockEntity.java deleted file mode 100644 index c3a960d..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/block/tile/StructureGenBlockEntity.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.ticticboooom.mods.mm.block.tile; - -import com.ticticboooom.mods.mm.block.container.StructureGenBlockContainer; -import com.ticticboooom.mods.mm.inventory.ItemStackInventory; -import com.ticticboooom.mods.mm.model.ProcessUpdate; -import com.ticticboooom.mods.mm.registration.MMSetup; -import lombok.Getter; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.ItemStackHelper; -import net.minecraft.inventory.container.Container; -import net.minecraft.inventory.container.INamedContainerProvider; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.ITickableTileEntity; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.NonNullList; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; -import net.minecraftforge.items.ItemStackHandler; - -import javax.annotation.Nullable; - -public class StructureGenBlockEntity extends UpdatableTile implements ITickableTileEntity, INamedContainerProvider { - public StructureGenBlockEntity() { - super(MMSetup.STRUCTURE_TILE.get()); - } - - @Getter - private ItemStackHandler handler = new ItemStackHandler(1); - @Getter - private ItemStackInventory inv = new ItemStackInventory(handler); - - @Override - public CompoundNBT write(CompoundNBT nbt) { - nbt.put("inv", handler.serializeNBT()); - return super.write(nbt); - } - - @Override - public void read(BlockState p_230337_1_, CompoundNBT nbt) { - CompoundNBT inv = nbt.getCompound("inv"); - this.handler.deserializeNBT(inv); - super.read(p_230337_1_, nbt); - } - - - @Override - public void tick() { - update(); - } - - @Override - public ITextComponent getDisplayName() { - return new StringTextComponent("Structure Generator"); - } - - @Nullable - @Override - public Container createMenu(int p_createMenu_1_, PlayerInventory p_createMenu_2_, PlayerEntity p_createMenu_3_) { - return new StructureGenBlockContainer(p_createMenu_1_, p_createMenu_2_, this); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/block/tile/UpdatableTile.java b/src/main/java/com/ticticboooom/mods/mm/block/tile/UpdatableTile.java deleted file mode 100644 index df078d9..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/block/tile/UpdatableTile.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.ticticboooom.mods.mm.block.tile; - -import com.ticticboooom.mods.mm.network.PacketHandler; -import com.ticticboooom.mods.mm.network.packets.TileClientUpdatePacket; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.ITickableTileEntity; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityType; -import net.minecraftforge.fml.network.PacketDistributor; - -public class UpdatableTile extends TileEntity{ - public UpdatableTile(TileEntityType p_i48289_1_) { - super(p_i48289_1_); - } - - public void update() { - if (!world.isRemote()){ - PacketHandler.INSTANCE.send(PacketDistributor.ALL.noArg(), new TileClientUpdatePacket.Data(pos, write(new CompoundNBT()))); - } - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/MMRenderTypes.java b/src/main/java/com/ticticboooom/mods/mm/client/MMRenderTypes.java deleted file mode 100644 index 41ca39e..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/MMRenderTypes.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.ticticboooom.mods.mm.client; - -import net.minecraft.client.renderer.RenderState; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.client.renderer.vertex.VertexFormat; -import org.lwjgl.opengl.GL11; - -import java.util.OptionalDouble; - -public class MMRenderTypes extends RenderType { - private static final RenderState.LineState THICK_LINES = new RenderState.LineState(OptionalDouble.of(3.0D)); - - - public static final RenderType OUTLINE = makeType("MMOutline", - DefaultVertexFormats.POSITION_COLOR, GL11.GL_QUADS, 256, - RenderType.State.getBuilder() - .line(THICK_LINES) - .layer(RenderState.NO_LAYERING) - .transparency(RenderState.TRANSLUCENT_TRANSPARENCY) - .texture(NO_TEXTURE) - .depthTest(DEPTH_LEQUAL) - .cull(CULL_DISABLED) - .lightmap(LIGHTMAP_DISABLED) - .writeMask(COLOR_WRITE) - .build(false)); - - public MMRenderTypes(String nameIn, VertexFormat formatIn, int drawModeIn, int bufferSizeIn, boolean useDelegateIn, boolean needsSortingIn, Runnable setupTaskIn, Runnable clearTaskIn) { - super(nameIn, formatIn, drawModeIn, bufferSizeIn, useDelegateIn, needsSortingIn, setupTaskIn, clearTaskIn); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/MMJeiPlugin.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/MMJeiPlugin.java deleted file mode 100644 index a8739c8..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/MMJeiPlugin.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei; - -import com.google.common.collect.ImmutableList; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.ControllerBlock; -import com.ticticboooom.mods.mm.client.jei.category.MachineProcessRecipeCategory; -import com.ticticboooom.mods.mm.client.jei.category.MachineStructureRecipeCategory; -import com.ticticboooom.mods.mm.client.jei.ingredients.as.StarlightIngredientHelper; -import com.ticticboooom.mods.mm.client.jei.ingredients.as.StarlightIngredientRenderer; -import com.ticticboooom.mods.mm.client.jei.ingredients.as.StarlightIngredientType; -import com.ticticboooom.mods.mm.client.jei.ingredients.energy.EnergyIngredientHelper; -import com.ticticboooom.mods.mm.client.jei.ingredients.energy.EnergyIngredientRenderer; -import com.ticticboooom.mods.mm.client.jei.ingredients.energy.EnergyIngredientType; -import com.ticticboooom.mods.mm.client.jei.ingredients.mana.ManaIngredientHelper; -import com.ticticboooom.mods.mm.client.jei.ingredients.mana.ManaIngredientRenderer; -import com.ticticboooom.mods.mm.client.jei.ingredients.mana.ManaIngredientType; -import com.ticticboooom.mods.mm.client.jei.ingredients.pressure.PNCPressureIngredientHelper; -import com.ticticboooom.mods.mm.client.jei.ingredients.pressure.PNCPressureIngredientRenderer; -import com.ticticboooom.mods.mm.client.jei.ingredients.pressure.PNCPressureIngredientType; -import com.ticticboooom.mods.mm.client.jei.ingredients.rotation.RotationIngredientHelper; -import com.ticticboooom.mods.mm.client.jei.ingredients.rotation.RotationIngredientRenderer; -import com.ticticboooom.mods.mm.client.jei.ingredients.rotation.RotationIngredientType; -import com.ticticboooom.mods.mm.data.MachineProcessRecipe; -import com.ticticboooom.mods.mm.data.MachineStructureRecipe; -import com.ticticboooom.mods.mm.registration.MMLoader; -import com.ticticboooom.mods.mm.registration.RecipeTypes; -import mezz.jei.api.IModPlugin; -import mezz.jei.api.JeiPlugin; -import mezz.jei.api.registration.IModIngredientRegistration; -import mezz.jei.api.registration.IRecipeCategoryRegistration; -import mezz.jei.api.registration.IRecipeRegistration; -import net.minecraft.client.Minecraft; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.RegistryObject; - -import java.util.List; -import java.util.stream.Collectors; - -@JeiPlugin -public class MMJeiPlugin implements IModPlugin { - public static final EnergyIngredientType ENERGY_TYPE = new EnergyIngredientType(); - public static final EnergyIngredientRenderer ENERGY_TYPE_RENDERER = new EnergyIngredientRenderer(); - public static final EnergyIngredientHelper ENERGY_TYPE_HELPER = new EnergyIngredientHelper(); - - public static final PNCPressureIngredientType PRESSURE_TYPE = new PNCPressureIngredientType(); - public static final PNCPressureIngredientRenderer PRESSURE_TYPE_RENDERER = new PNCPressureIngredientRenderer(); - public static final PNCPressureIngredientHelper PRESSURE_TYPE_HELPER = new PNCPressureIngredientHelper(); - - public static final ManaIngredientType MANA_TYPE = new ManaIngredientType(); - public static final ManaIngredientRenderer MANA_TYPE_RENDERER = new ManaIngredientRenderer(); - public static final ManaIngredientHelper MANA_TYPE_HELPER = new ManaIngredientHelper(); - - public static final StarlightIngredientType STAR_TYPE = new StarlightIngredientType(); - public static final StarlightIngredientRenderer STAR_TYPE_RENDERER = new StarlightIngredientRenderer(); - public static final StarlightIngredientHelper STAR_TYPE_HELPER = new StarlightIngredientHelper(); - - public static final RotationIngredientType ROT_TYPE = new RotationIngredientType(); - public static final RotationIngredientRenderer ROT_RENDERER = new RotationIngredientRenderer(); - public static final RotationIngredientHelper ROT_HELPER = new RotationIngredientHelper(); - - @Override - public ResourceLocation getPluginUid() { - return new ResourceLocation(MM.ID, "jei_main"); - } - - @Override - public void registerIngredients(IModIngredientRegistration registration) { - registration.register(MMJeiPlugin.ENERGY_TYPE, ImmutableList.of(), ENERGY_TYPE_HELPER, ENERGY_TYPE_RENDERER); - registration.register(MMJeiPlugin.PRESSURE_TYPE, ImmutableList.of(), PRESSURE_TYPE_HELPER, PRESSURE_TYPE_RENDERER); - registration.register(MMJeiPlugin.MANA_TYPE, ImmutableList.of(), MANA_TYPE_HELPER, MANA_TYPE_RENDERER); - registration.register(MMJeiPlugin.STAR_TYPE, ImmutableList.of(), STAR_TYPE_HELPER, STAR_TYPE_RENDERER); - registration.register(MMJeiPlugin.ROT_TYPE, ImmutableList.of(), ROT_HELPER, ROT_RENDERER); - } - - @Override - public void registerRecipes(IRecipeRegistration registration) { - ENERGY_TYPE_RENDERER.setHelpers(registration.getJeiHelpers()); - PRESSURE_TYPE_RENDERER.setHelpers(registration.getJeiHelpers()); - MANA_TYPE_RENDERER.setHelpers(registration.getJeiHelpers()); - STAR_TYPE_RENDERER.setHelpers(registration.getJeiHelpers()); - ROT_RENDERER.setHelpers(registration.getJeiHelpers()); - List structureRecipes = Minecraft.getInstance().world.getRecipeManager().getRecipesForType(RecipeTypes.MACHINE_STRUCTURE); - for (RegistryObject block : MMLoader.BLOCKS) { - registration.addRecipes(structureRecipes.stream().filter(x -> x.getControllerId().contains(block.get().getControllerId())).collect(Collectors.toList()), new ResourceLocation(MM.ID, "machine_structure_" + block.get().getControllerId())); - } - - List processRecipes = Minecraft.getInstance().world.getRecipeManager().getRecipesForType(RecipeTypes.MACHINE_PROCESS); - for (MachineStructureRecipe structureRecipe : structureRecipes) { - List recipes = processRecipes.stream().filter(x -> x.getStructureId().equals(structureRecipe.getStructureId())).collect(Collectors.toList()); - registration.addRecipes(recipes, new ResourceLocation(MM.ID, "machine_process_" + structureRecipe.getStructureId())); - } - } - - @Override - public void registerCategories(IRecipeCategoryRegistration registration) { - ENERGY_TYPE_RENDERER.setHelpers(registration.getJeiHelpers()); - for (RegistryObject block : MMLoader.BLOCKS) { - registration.addRecipeCategories(new MachineStructureRecipeCategory(registration.getJeiHelpers(), block.get())); - } - List structureRecipes = Minecraft.getInstance().world.getRecipeManager().getRecipesForType(RecipeTypes.MACHINE_STRUCTURE); - for (MachineStructureRecipe structureRecipe : structureRecipes) { - registration.addRecipeCategories(new MachineProcessRecipeCategory(registration.getJeiHelpers(), structureRecipe.getStructureId(), structureRecipe.getName())); - } - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/category/MachineProcessRecipeCategory.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/category/MachineProcessRecipeCategory.java deleted file mode 100644 index 1f9a9cf..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/category/MachineProcessRecipeCategory.java +++ /dev/null @@ -1,153 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei.category; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.data.MachineProcessRecipe; -import com.ticticboooom.mods.mm.ports.MasterfulPortType; -import com.ticticboooom.mods.mm.ports.state.PortState; -import com.ticticboooom.mods.mm.registration.MMPorts; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.gui.drawable.IDrawable; -import mezz.jei.api.gui.drawable.IDrawableStatic; -import mezz.jei.api.helpers.IJeiHelpers; -import mezz.jei.api.ingredients.IIngredients; -import mezz.jei.api.recipe.category.IRecipeCategory; -import net.minecraft.util.ResourceLocation; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class MachineProcessRecipeCategory implements IRecipeCategory { - - private static final ResourceLocation overlayRl = new ResourceLocation(MM.ID, "textures/gui/gui_large_jei.png"); - - private IJeiHelpers helpers; - private String structureId; - private String structureName; - - public MachineProcessRecipeCategory(IJeiHelpers helpers, String structureId, String structureName) { - this.helpers = helpers; - - this.structureId = structureId; - this.structureName = structureName; - } - - @Override - public ResourceLocation getUid() { - return new ResourceLocation(MM.ID, "machine_process_" + structureId); - } - - @Override - public Class getRecipeClass() { - return MachineProcessRecipe.class; - } - - @Override - public String getTitle() { - return structureName + " Recipes"; - } - - public IDrawable getBackground() { - return helpers.getGuiHelper().createBlankDrawable(162, 150); - } - - @Override - public IDrawable getIcon() { - return null; - } - - @Override - public void setIngredients(MachineProcessRecipe recipe, IIngredients ingredients) { - Map> inputStacks = new HashMap<>(); - Map> outputStacks = new HashMap<>(); - - for (PortState input : recipe.getInputs()) { - inputStacks.putIfAbsent(input.getName(), new ArrayList()); - List stacks = inputStacks.getOrDefault(input.getName(), new ArrayList<>()); - stacks.addAll(input.getIngredient(true)); - inputStacks.put(input.getName(), stacks); - } - - for (PortState output : recipe.getOutputs()) { - outputStacks.putIfAbsent(output.getName(), new ArrayList()); - List stacks = outputStacks.getOrDefault(output.getName(), new ArrayList<>()); - stacks.addAll(output.getIngredient(true)); - outputStacks.put(output.getName(), stacks); - } - - for (Map.Entry> entry : inputStacks.entrySet()) { - MasterfulPortType masterfulPortType = MMPorts.PORTS.get(entry.getKey()); - masterfulPortType.getParser().setIngredients(ingredients, entry.getValue(), true); - } - - for (Map.Entry> entry : outputStacks.entrySet()) { - MasterfulPortType masterfulPortType = MMPorts.PORTS.get(entry.getKey()); - masterfulPortType.getParser().setIngredients(ingredients, entry.getValue(), false); - } - } - - @Override - public void setRecipe(IRecipeLayout recipeLayout, MachineProcessRecipe recipe, IIngredients ingredients) { - final int inputWidth = 60; - Map indexMap = new HashMap<>(); - int currentX = 0; - int currentY = 0; - for (PortState input : recipe.getInputs()) { - Integer index = indexMap.getOrDefault(input.getClass().toString(), 0); - input.setupRecipe(recipeLayout, index, currentX, currentY, true); - indexMap.put(input.getClass().toString(), ++index); - currentX += 20; - if (currentX >= inputWidth) { - currentX = 0; - currentY += 20; - } - } - - final int offsetX = 95; - currentX = offsetX; - currentY = 0; - for (PortState output : recipe.getOutputs()) { - Integer index = indexMap.getOrDefault(output.getClass().toString(), 0); - output.setupRecipe(recipeLayout, index, currentX, currentY, false); - indexMap.put(output.getClass().toString(), ++index); - currentX += 20; - if (currentX >= inputWidth + offsetX) { - currentX = offsetX; - currentY += 20; - } - } - } - - @Override - public void draw(MachineProcessRecipe recipe, MatrixStack matrixStack, double mouseX, double mouseY) { - final int inputWidth = 60; - - int currentX = 0; - int currentY = 0; - for (PortState input : recipe.getInputs()) { - input.render(matrixStack, currentX, currentY, (int) mouseX, (int) mouseY, helpers); - currentX += 20; - if (currentX >= inputWidth) { - currentX = 0; - currentY += 20; - } - } - - final int offsetX = 95; - currentX = offsetX; - currentY = 0; - for (PortState output : recipe.getOutputs()) { - output.render(matrixStack, currentX, currentY, (int) mouseX, (int) mouseY, helpers); - currentX += 20; - if (currentX >= inputWidth + offsetX) { - currentX = offsetX; - currentY += 20; - } - } - - IDrawableStatic drawable = helpers.getGuiHelper().createDrawable(new ResourceLocation(MM.ID, "textures/gui/slot_parts.png"), 26, 0, 24, 17); - drawable.draw(matrixStack, 66, 5); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/category/MachineStructureRecipeCategory.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/category/MachineStructureRecipeCategory.java deleted file mode 100644 index f88d521..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/category/MachineStructureRecipeCategory.java +++ /dev/null @@ -1,339 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei.category; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.ControllerBlock; -import com.ticticboooom.mods.mm.block.MachinePortBlock; -import com.ticticboooom.mods.mm.client.util.GuiBlockRenderBuilder; -import com.ticticboooom.mods.mm.data.MachineStructureRecipe; -import com.ticticboooom.mods.mm.data.model.structure.MachineStructureBlockPos; -import com.ticticboooom.mods.mm.data.model.structure.MachineStructurePort; -import com.ticticboooom.mods.mm.data.model.structure.MachineStructureRecipeKeyModel; -import com.ticticboooom.mods.mm.helper.GLScissor; -import com.ticticboooom.mods.mm.helper.RLUtils; -import com.ticticboooom.mods.mm.registration.MMLoader; -import com.ticticboooom.mods.mm.registration.MMSetup; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.gui.drawable.IDrawable; -import mezz.jei.api.helpers.IJeiHelpers; -import mezz.jei.api.ingredients.IIngredients; -import mezz.jei.api.recipe.category.IRecipeCategory; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.DirectionalBlock; -import net.minecraft.client.Minecraft; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.Ingredient; -import net.minecraft.state.Property; -import net.minecraft.tags.BlockTags; -import net.minecraft.tags.ITag; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.vector.Quaternion; -import net.minecraft.util.math.vector.Vector3f; -import net.minecraft.util.math.vector.Vector4f; -import net.minecraftforge.fml.RegistryObject; -import net.minecraftforge.registries.ForgeRegistries; -import org.lwjgl.glfw.GLFW; - -import java.util.*; -import java.util.stream.Collectors; - -public class MachineStructureRecipeCategory implements IRecipeCategory { - - private static final ResourceLocation overlayRl = new ResourceLocation(MM.ID, "textures/gui/gui_large_jei.png"); - private static final ResourceLocation iconRl = new ResourceLocation(MM.ID, "textures/items/blueprint.png"); - private static final ResourceLocation slotRl = new ResourceLocation(MM.ID, "textures/gui/slot_parts.png"); - private IJeiHelpers helpers; - private ControllerBlock controller; - private MachineStructureRecipe recipe; - private float xRotation = 0; - private double xLastMousePosition = 0; - private float yRotation = 0; - private double yLastMousePosition = 0; - private int scrollLastPos = 0; - private Vector3f prePos; - - private int sliceY = 0; - private boolean slicingActive = false; - private float scaleFactor = 1F; - - private int tickTimer = 0; - private Map variantIndices = new HashMap<>(); - - public MachineStructureRecipeCategory(IJeiHelpers helpers, ControllerBlock controller) { - this.helpers = helpers; - this.controller = controller; - } - - @Override - public ResourceLocation getUid() { - return new ResourceLocation(MM.ID, "machine_structure_" + controller.getControllerId()); - } - - @Override - public Class getRecipeClass() { - return MachineStructureRecipe.class; - } - - @Override - public String getTitle() { - return controller.getControllerName(); - } - - @Override - public IDrawable getBackground() { - - return helpers.getGuiHelper().createDrawable(overlayRl, 0, 0, 162, 150); - } - - @Override - public IDrawable getIcon() { - return helpers.getGuiHelper().createDrawableIngredient(new ItemStack(MMSetup.BLUEPRINT.get(), 1)); - } - - private IDrawable getButton() { - return helpers.getGuiHelper().createDrawable(slotRl, 0, 44, 18, 18); - } - - @Override - public void setIngredients(MachineStructureRecipe machineStructureRecipe, IIngredients iIngredients) { - Ingredient ingredient = Ingredient.fromStacks(new ItemStack(MMSetup.BLUEPRINT.get())); - ArrayList objects = new ArrayList<>(); - objects.add(ingredient); - objects.add(Ingredient.fromStacks(new ItemStack(ForgeRegistries.ITEMS.getValue(controller.getRegistryName())))); - iIngredients.setInputIngredients(objects); - } - - @Override - public void setRecipe(IRecipeLayout iRecipeLayout, MachineStructureRecipe recipe, IIngredients iIngredients) { - this.xRotation = 0; - this.yRotation = 0; - this.yLastMousePosition = 0; - this.xLastMousePosition = 0; - this.scaleFactor = 1.2f; - this.recipe = recipe; - this.sliceY = 0; - this.slicingActive = false; - - this.variantIndices.clear(); - this.tickTimer = 0; - float tx = 6.75f, ty = -5, tz = 10; - prePos = new Vector3f(tx, ty, tz); - } - - @Override - public void draw(MachineStructureRecipe recipe, MatrixStack matrixStack, double mouseX, double mouseY) { - Minecraft mc = Minecraft.getInstance(); - if (xLastMousePosition == 0) { - xLastMousePosition = mouseX; - } - if (yLastMousePosition == 0) { - yLastMousePosition = mouseY; - } - - // Do mouse rotations - if (GLFW.glfwGetMouseButton(mc.getMainWindow().getHandle(), GLFW.GLFW_MOUSE_BUTTON_1) != 0 && GLFW.glfwGetKey(mc.getMainWindow().getHandle(), GLFW.GLFW_KEY_LEFT_SHIFT) == 0) { - double relMoveX = mouseX - xLastMousePosition; - double relMoveY = mouseY - yLastMousePosition; - xRotation += relMoveX; - yRotation += relMoveY; - } - - // Calculate distances - int minX = Integer.MAX_VALUE; - int maxX = Integer.MIN_VALUE; - int minZ = Integer.MAX_VALUE; - int maxZ = Integer.MIN_VALUE; - int minY = Integer.MAX_VALUE; - int maxY = Integer.MIN_VALUE; - for (MachineStructureRecipeKeyModel part : recipe.getModels().get(0)) { - minX = Math.min(part.getPos().getX(), minX); - maxX = Math.max(part.getPos().getX(), maxX); - minZ = Math.min(part.getPos().getZ(), minZ); - maxZ = Math.max(part.getPos().getZ(), maxZ); - minY = Math.min(part.getPos().getY(), minY); - maxY = Math.max(part.getPos().getY(), maxY); - } - - // Do mouse scroll zoom - if (GLFW.glfwGetMouseButton(mc.getMainWindow().getHandle(), GLFW.GLFW_MOUSE_BUTTON_RIGHT) != 0 && GLFW.glfwGetKey(mc.getMainWindow().getHandle(), GLFW.GLFW_KEY_LEFT_SHIFT) == 0) { - if (scrollLastPos == 0) { - scrollLastPos = (int) mouseY; - } - scaleFactor += (mouseY - yLastMousePosition) * 0.05; - scaleFactor = Math.max(0.003f, scaleFactor); - } - float centreX = ((float) maxX - minX) / 2f; - float centerY = ((float) maxY - minY) / 2f; - float centreZ = ((float) maxZ - minZ) / 2f; - mc.fontRenderer.drawString(matrixStack, recipe.getName(), 2, 2, 0xFFFFFFFF); - - // Get the block parts for the layer - List parts = recipe.getModels().get(0); - if (slicingActive) { - parts = parts.stream().filter(x -> x.getPos().getY() == sliceY).collect(Collectors.toList()); - } - - //float tx = 6.5f, ty = -5, tz = 10; - - if (GLFW.glfwGetMouseButton(mc.getMainWindow().getHandle(), GLFW.GLFW_MOUSE_BUTTON_LEFT) != 0 && GLFW.glfwGetKey(mc.getMainWindow().getHandle(), GLFW.GLFW_KEY_LEFT_SHIFT) != 0){ - double relMoveX = mouseX - xLastMousePosition; - double relMoveY = mouseY - yLastMousePosition; - prePos.add((float)relMoveX * 0.08f, (float)-relMoveY * 0.08f, 0); - } - Vector3f offset = new Vector3f(-minX - 0.5f - centreX, -minY - 0.5f - centerY, -minZ - 0.5f + centreZ); - - Vector4f zero = new Vector4f(0, 0, 0, 1); - zero.transform(matrixStack.getLast().getMatrix().copy()); - GLScissor.enable((int)zero.getX(), (int)zero.getY(), 160, 120); - // Render the block parts - for (MachineStructureRecipeKeyModel part : parts) { - this.variantIndices.putIfAbsent(part.getPos(), 0); - if (part.getBlock().isEmpty() && part.getTag().isEmpty() && part.getPort() == null) { - continue; - } - - BlockPos bp = new BlockPos(-part.getPos().getX(), part.getPos().getY(), -part.getPos().getZ()); - - if (!part.getBlock().equals("")) { - ResourceLocation resourceLocation = new ResourceLocation(part.getBlock()); - Block block = ForgeRegistries.BLOCKS.getValue(resourceLocation); - if (block != null) { - BlockState defaultState = block.getDefaultState(); - defaultState = with(defaultState, part.getProperties()); - renderBlock(defaultState, bp, prePos, offset, matrixStack); - } - } else if (!part.getTag().equals("")) { - ResourceLocation resourceLocation = new ResourceLocation(part.getTag()); - ITag tag = BlockTags.getCollection().getTagByID(resourceLocation); - Integer index = this.variantIndices.get(part.getPos()); - - Block block = tag.getAllElements().get(index); - if (this.tickTimer == 0) { - this.variantIndices.put(part.getPos(), (index + 1) % tag.getAllElements().size()); - } - - if (block != null) { - BlockState defaultState = block.getDefaultState(); - defaultState = with(defaultState, part.getProperties()); - renderBlock(defaultState, bp, prePos, offset, matrixStack); - } - } else if (part.getPort() != null) { - MachineStructurePort port = part.getPort(); - ArrayList> ports = port.isInput() ? MMLoader.IPORT_BLOCKS : MMLoader.OPORT_BLOCKS; - Integer index = this.variantIndices.get(part.getPos()); - String controllerId = port.getControllerId().get(index); - if (this.tickTimer == 0) { - this.variantIndices.put(part.getPos(), (index + 1) % port.getControllerId().size()); - } - String type = port.getType(); - MachinePortBlock block = null; - for (RegistryObject regPortBlock : ports) { - MachinePortBlock portBlock = regPortBlock.get(); - if (portBlock.getPortTypeId().equals(RLUtils.toRL(type)) && portBlock.getControllerId().equals(controllerId)) { - block = portBlock; - break; - } - } - if (block != null) { - BlockState defaultState = block.getDefaultState(); - defaultState = with(defaultState, part.getProperties()); - renderBlock(defaultState, bp, prePos, offset, matrixStack); - } - } - } - // Render the controller block - if (sliceY == 0) { - ControllerBlock block = null; - MachineStructureBlockPos controllerPos = new MachineStructureBlockPos(0, 0, 0); - this.variantIndices.putIfAbsent(controllerPos, 0); - Integer index = this.variantIndices.get(controllerPos); - String controller = recipe.getControllerId().get(index); - if (this.tickTimer == 0) { - this.variantIndices.put(controllerPos, (index + 1) % recipe.getControllerId().size()); - } - for (RegistryObject reg : MMLoader.BLOCKS) { - if (reg.get().getControllerId().equals(controller)) { - block = reg.get(); - } - } - if (block != null) { - BlockState defaultState = block.getDefaultState().with(DirectionalBlock.FACING, Direction.NORTH); - renderBlock(defaultState, new BlockPos(0, 0, 0), prePos, offset, matrixStack); - } - } - GLScissor.disable(); - - // End tick - xLastMousePosition = mouseX; - yLastMousePosition = mouseY; - getButton().draw(matrixStack, 144, 125); - if (++this.tickTimer % 40 == 0) { - this.tickTimer = 0; - } - } - - @Override - public boolean handleClick(MachineStructureRecipe recipe, double mouseX, double mouseY, int mouseButton) { - if (mouseX > 144 && mouseY > 125 && mouseX < 162 && mouseY < 143) { - startIncrementSlice(); - } - return false; - } - - private void startIncrementSlice() { - - int topY = Integer.MIN_VALUE; - int bottomY = Integer.MAX_VALUE; - - for (MachineStructureRecipeKeyModel part : recipe.getModels().get(0)) { - topY = Math.max(part.getPos().getY(), topY); - bottomY = Math.min(part.getPos().getY(), bottomY); - } - - if (!slicingActive) { - slicingActive = true; - sliceY = bottomY; - } else if (sliceY == topY) { - slicingActive = false; - sliceY = 0; - } else { - sliceY++; - } - - } - - private BlockState with(BlockState defaultState, Map props) { - if (props == null) { - return defaultState; - } - for (Map.Entry stringStringEntry : props.entrySet()) { - for (Property property : defaultState.getProperties()) { - Optional o = property.parseValue(stringStringEntry.getValue()); - if (!o.isPresent()) { - return defaultState; - } - for (Comparable allowedValue : property.getAllowedValues()) { - defaultState = defaultState.cycleValue(property); - if (defaultState.get(property).equals(o.get())) { - return defaultState; - } - } - } - } - return defaultState; - } - - private void renderBlock(BlockState defaultState, BlockPos bp, Vector3f prePos, Vector3f offset, MatrixStack ms) { - new GuiBlockRenderBuilder(defaultState).at(bp) - .withPrePosition(prePos) - .withRotation(new Quaternion(new Vector3f(1, 0, 0), 15 + yRotation, true)) - .withRotation(new Quaternion(new Vector3f(0, -1, 0), 225 - xRotation, true)) - .withScale(new Vector3f(scaleFactor, -scaleFactor, scaleFactor)) - .withOffset(offset) - .finalize(ms); - } - -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/category/render/AirBlockReader.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/category/render/AirBlockReader.java deleted file mode 100644 index ad86c37..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/category/render/AirBlockReader.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei.category.render; - -import net.minecraft.block.BlockState; -import net.minecraft.fluid.FluidState; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockReader; - -import javax.annotation.Nullable; - -public class AirBlockReader implements IBlockReader { - private TileEntity tile; - private BlockState state; - - public AirBlockReader(BlockState state) { - this.state = state; - } - - public void setTile(TileEntity t){ - tile = t; - } - - @Nullable - @Override - public TileEntity getTileEntity(BlockPos pos) { - return tile; - } - - @Override - public BlockState getBlockState(BlockPos pos) { - return state; - } - - @Override - public FluidState getFluidState(BlockPos pos) { - return null; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/as/StarlightIngredientHelper.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/as/StarlightIngredientHelper.java deleted file mode 100644 index 28bc63f..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/as/StarlightIngredientHelper.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei.ingredients.as; - -import com.ticticboooom.mods.mm.client.jei.ingredients.model.PressureStack; -import com.ticticboooom.mods.mm.client.jei.ingredients.model.StarlightStack; -import mezz.jei.api.ingredients.IIngredientHelper; - -import javax.annotation.Nullable; - -public class StarlightIngredientHelper implements IIngredientHelper { - - @Nullable - @Override - public StarlightStack getMatch(Iterable ingredients, StarlightStack ingredientToMatch) { - return ingredientToMatch; - } - - @Override - public String getDisplayName(StarlightStack ingredient) { - return "Starlight"; - } - - @Override - public String getUniqueId(StarlightStack ingredient) { - return ingredient.getAmount() + ""; - } - - @Override - public String getModId(StarlightStack ingredient) { - return "astralsorcery"; - } - - @Override - public String getResourceId(StarlightStack ingredient) { - return "starlight"; - } - - @Override - public StarlightStack copyIngredient(StarlightStack ingredient) { - return new StarlightStack(ingredient.getAmount()); - } - - @Override - public String getErrorInfo(@Nullable StarlightStack ingredient) { - return "Error"; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/as/StarlightIngredientRenderer.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/as/StarlightIngredientRenderer.java deleted file mode 100644 index c3d53cd..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/as/StarlightIngredientRenderer.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei.ingredients.as; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.client.jei.ingredients.model.PressureStack; -import com.ticticboooom.mods.mm.client.jei.ingredients.model.StarlightStack; -import lombok.Setter; -import mezz.jei.api.gui.drawable.IDrawableStatic; -import mezz.jei.api.helpers.IJeiHelpers; -import mezz.jei.api.ingredients.IIngredientRenderer; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; - -import javax.annotation.Nullable; -import java.util.List; - -public class StarlightIngredientRenderer implements IIngredientRenderer { - @Setter - private IJeiHelpers helpers; - - @Override - public void render(MatrixStack matrixStack, int xPosition, int yPosition, @Nullable StarlightStack ingredient) { - if (ingredient != null) { - IDrawableStatic drawable = helpers.getGuiHelper().createDrawable(new ResourceLocation(MM.ID, "textures/gui/slot_parts.png"), 37, 80, 16, 16); - drawable.draw(matrixStack, xPosition, yPosition); - } - } - - @Override - public List getTooltip(StarlightStack ingredient, ITooltipFlag tooltipFlag) { - return Lists.newArrayList( - new StringTextComponent("Astral Starlight"), - new StringTextComponent(ingredient.getAmount() + " S") - ); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/as/StarlightIngredientType.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/as/StarlightIngredientType.java deleted file mode 100644 index 330ad7f..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/as/StarlightIngredientType.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei.ingredients.as; - -import com.ticticboooom.mods.mm.client.jei.ingredients.model.PressureStack; -import com.ticticboooom.mods.mm.client.jei.ingredients.model.StarlightStack; -import mezz.jei.api.ingredients.IIngredientType; - -public class StarlightIngredientType implements IIngredientType { - @Override - public Class getIngredientClass() { - return StarlightStack.class; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/energy/EnergyIngredientHelper.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/energy/EnergyIngredientHelper.java deleted file mode 100644 index 16c0faa..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/energy/EnergyIngredientHelper.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei.ingredients.energy; - -import com.ticticboooom.mods.mm.client.jei.ingredients.model.EnergyStack; -import mezz.jei.api.ingredients.IIngredientHelper; - -import javax.annotation.Nullable; - -public class EnergyIngredientHelper implements IIngredientHelper { - @Nullable - @Override - public EnergyStack getMatch(Iterable ingredients, EnergyStack ingredientToMatch) { - return ingredientToMatch; - } - - @Override - public String getDisplayName(EnergyStack ingredient) { - return "Forge Energy"; - } - - @Override - public String getUniqueId(EnergyStack ingredient) { - return "fe_" + ingredient + "_fe"; - } - - @Override - public String getModId(EnergyStack ingredient) { - return "forge"; - } - - @Override - public String getResourceId(EnergyStack ingredient) { - return "fe_" + ingredient.getAmount() + "_fe"; - } - - @Override - public EnergyStack copyIngredient(EnergyStack ingredient) { - return new EnergyStack(ingredient.getAmount()); - } - - @Override - public String getErrorInfo(@Nullable EnergyStack ingredient) { - return "Error"; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/energy/EnergyIngredientRenderer.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/energy/EnergyIngredientRenderer.java deleted file mode 100644 index e09fc98..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/energy/EnergyIngredientRenderer.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei.ingredients.energy; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.client.jei.ingredients.model.EnergyStack; -import lombok.Setter; -import mezz.jei.api.gui.drawable.IDrawableStatic; -import mezz.jei.api.helpers.IJeiHelpers; -import mezz.jei.api.ingredients.IIngredientRenderer; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; - -import javax.annotation.Nullable; -import java.text.NumberFormat; -import java.util.List; - -public class EnergyIngredientRenderer implements IIngredientRenderer { - @Setter - private IJeiHelpers helpers; - @Override - public void render(MatrixStack matrixStack, int xPosition, int yPosition, @Nullable EnergyStack ingredient) { - if (ingredient != null) { - IDrawableStatic drawable = helpers.getGuiHelper().createDrawable(new ResourceLocation(MM.ID, "textures/gui/slot_parts.png"), 19, 62, 16, 16); - drawable.draw(matrixStack, xPosition, yPosition); - } - } - - @Override - public List getTooltip(EnergyStack ingredient, ITooltipFlag tooltipFlag) { - return Lists.newArrayList( - new StringTextComponent("Forge Energy"), - new StringTextComponent(NumberFormat.getInstance().format(ingredient.getAmount()) + " FE") - ); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/energy/EnergyIngredientType.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/energy/EnergyIngredientType.java deleted file mode 100644 index 806cf47..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/energy/EnergyIngredientType.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei.ingredients.energy; - -import com.ticticboooom.mods.mm.client.jei.ingredients.model.EnergyStack; -import mezz.jei.api.ingredients.IIngredientType; - -public class EnergyIngredientType implements IIngredientType { - @Override - public Class getIngredientClass() { - return EnergyStack.class; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/mana/ManaIngredientHelper.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/mana/ManaIngredientHelper.java deleted file mode 100644 index 9c29957..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/mana/ManaIngredientHelper.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei.ingredients.mana; - -import com.ticticboooom.mods.mm.client.jei.ingredients.model.PressureStack; -import com.ticticboooom.mods.mm.inventory.botania.PortManaInventory; -import mezz.jei.api.ingredients.IIngredientHelper; - -import javax.annotation.Nullable; - -public class ManaIngredientHelper implements IIngredientHelper { - - @Nullable - @Override - public PortManaInventory getMatch(Iterable ingredients, PortManaInventory ingredientToMatch) { - return ingredientToMatch; - } - - @Override - public String getDisplayName(PortManaInventory ingredient) { - return "Mana"; - } - - @Override - public String getUniqueId(PortManaInventory ingredient) { - return ingredient.getManaStored() + ""; - } - - @Override - public String getModId(PortManaInventory ingredient) { - return "botania"; - } - - @Override - public String getResourceId(PortManaInventory ingredient) { - return "mana"; - } - - @Override - public PortManaInventory copyIngredient(PortManaInventory ingredient) { - return new PortManaInventory(ingredient.getManaStored(), ingredient.getMaxManaStored()); - } - - @Override - public String getErrorInfo(@Nullable PortManaInventory ingredient) { - return "Error"; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/mana/ManaIngredientRenderer.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/mana/ManaIngredientRenderer.java deleted file mode 100644 index a9e17ce..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/mana/ManaIngredientRenderer.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei.ingredients.mana; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.client.jei.ingredients.model.PressureStack; -import com.ticticboooom.mods.mm.inventory.botania.PortManaInventory; -import lombok.Setter; -import mezz.jei.api.gui.drawable.IDrawableStatic; -import mezz.jei.api.helpers.IJeiHelpers; -import mezz.jei.api.ingredients.IIngredientRenderer; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; - -import javax.annotation.Nullable; -import java.util.List; - -public class ManaIngredientRenderer implements IIngredientRenderer { - @Setter - private IJeiHelpers helpers; - - @Override - public void render(MatrixStack matrixStack, int xPosition, int yPosition, @Nullable PortManaInventory ingredient) { - if (ingredient != null) { - IDrawableStatic drawable = helpers.getGuiHelper().createDrawable(new ResourceLocation(MM.ID, "textures/gui/slot_parts.png"), 19, 80, 16, 16); - drawable.draw(matrixStack, xPosition, yPosition); - } - } - - @Override - public List getTooltip(PortManaInventory ingredient, ITooltipFlag tooltipFlag) { - return Lists.newArrayList( - new StringTextComponent("Botania Mana"), - new StringTextComponent(ingredient.getManaStored() + " Units") - ); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/mana/ManaIngredientType.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/mana/ManaIngredientType.java deleted file mode 100644 index d8f425a..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/mana/ManaIngredientType.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei.ingredients.mana; - -import com.ticticboooom.mods.mm.inventory.botania.PortManaInventory; -import mezz.jei.api.ingredients.IIngredientType; - -public class ManaIngredientType implements IIngredientType { - @Override - public Class getIngredientClass() { - return PortManaInventory.class; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/model/EnergyStack.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/model/EnergyStack.java deleted file mode 100644 index c5021b5..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/model/EnergyStack.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei.ingredients.model; - -import lombok.Getter; -import lombok.Setter; - -public class EnergyStack { - @Getter - @Setter - private int amount; - - public EnergyStack(int amount){ - - this.amount = amount; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/model/PressureStack.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/model/PressureStack.java deleted file mode 100644 index b0c391e..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/model/PressureStack.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei.ingredients.model; - -import lombok.Getter; -import lombok.Setter; - -public class PressureStack { - @Getter - @Setter - private float amount; - - public PressureStack(float amount){ - - this.amount = amount; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/model/RotationStack.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/model/RotationStack.java deleted file mode 100644 index 71e79d9..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/model/RotationStack.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei.ingredients.model; - -import lombok.Getter; -import lombok.Setter; - -public class RotationStack { - @Getter - @Setter - private float speed; - - public RotationStack(float speed){ - - this.speed = speed; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/model/StarlightStack.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/model/StarlightStack.java deleted file mode 100644 index 0832a15..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/model/StarlightStack.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei.ingredients.model; - -import lombok.Getter; -import lombok.Setter; - -public class StarlightStack { - @Getter - @Setter - private int amount; - - public StarlightStack(int amount){ - - this.amount = amount; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/pressure/PNCPressureIngredientHelper.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/pressure/PNCPressureIngredientHelper.java deleted file mode 100644 index 40aba65..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/pressure/PNCPressureIngredientHelper.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei.ingredients.pressure; - -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.client.jei.ingredients.model.PressureStack; -import mezz.jei.api.ingredients.IIngredientHelper; -import mezz.jei.api.ingredients.IIngredientType; -import net.minecraft.util.ResourceLocation; - -import javax.annotation.Nullable; - -public class PNCPressureIngredientHelper implements IIngredientHelper { - - @Nullable - @Override - public PressureStack getMatch(Iterable ingredients, PressureStack ingredientToMatch) { - return ingredientToMatch; - } - - @Override - public String getDisplayName(PressureStack ingredient) { - return "Pressure"; - } - - @Override - public String getUniqueId(PressureStack ingredient) { - return ingredient.getAmount() + ""; - } - - @Override - public String getModId(PressureStack ingredient) { - return "pneumaticcraft"; - } - - @Override - public String getResourceId(PressureStack ingredient) { - return "pressure"; - } - - @Override - public PressureStack copyIngredient(PressureStack ingredient) { - return new PressureStack(ingredient.getAmount()); - } - - @Override - public String getErrorInfo(@Nullable PressureStack ingredient) { - return "Error"; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/pressure/PNCPressureIngredientRenderer.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/pressure/PNCPressureIngredientRenderer.java deleted file mode 100644 index 6993fb5..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/pressure/PNCPressureIngredientRenderer.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei.ingredients.pressure; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.client.jei.ingredients.model.PressureStack; -import lombok.Setter; -import mezz.jei.api.gui.drawable.IDrawableStatic; -import mezz.jei.api.helpers.IJeiHelpers; -import mezz.jei.api.ingredients.IIngredientRenderer; -import mezz.jei.api.ingredients.IIngredientType; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; - -import javax.annotation.Nullable; -import java.util.List; - -public class PNCPressureIngredientRenderer implements IIngredientRenderer { - @Setter - private IJeiHelpers helpers; - - @Override - public void render(MatrixStack matrixStack, int xPosition, int yPosition, @Nullable PressureStack ingredient) { - if (ingredient != null) { - IDrawableStatic drawable = helpers.getGuiHelper().createDrawable(new ResourceLocation(MM.ID, "textures/gui/slot_parts.png"), 1, 62, 16, 16); - drawable.draw(matrixStack, xPosition, yPosition); - } - } - - @Override - public List getTooltip(PressureStack ingredient, ITooltipFlag tooltipFlag) { - return Lists.newArrayList( - new StringTextComponent("PNC Pressure"), - new StringTextComponent(ingredient.getAmount() + " Units") - ); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/pressure/PNCPressureIngredientType.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/pressure/PNCPressureIngredientType.java deleted file mode 100644 index cbd81a1..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/pressure/PNCPressureIngredientType.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei.ingredients.pressure; - -import com.ticticboooom.mods.mm.client.jei.ingredients.model.PressureStack; -import mezz.jei.api.ingredients.IIngredientType; - -public class PNCPressureIngredientType implements IIngredientType { - @Override - public Class getIngredientClass() { - return PressureStack.class; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/rotation/RotationIngredientHelper.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/rotation/RotationIngredientHelper.java deleted file mode 100644 index 26e13ef..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/rotation/RotationIngredientHelper.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei.ingredients.rotation; - -import com.ticticboooom.mods.mm.client.jei.ingredients.model.RotationStack; -import com.ticticboooom.mods.mm.client.jei.ingredients.model.StarlightStack; -import mezz.jei.api.ingredients.IIngredientHelper; - -import javax.annotation.Nullable; - -public class RotationIngredientHelper implements IIngredientHelper { - - @Nullable - @Override - public RotationStack getMatch(Iterable ingredients, RotationStack ingredientToMatch) { - return ingredientToMatch; - } - - @Override - public String getDisplayName(RotationStack ingredient) { - return "SU"; - } - - @Override - public String getUniqueId(RotationStack ingredient) { - return ingredient.getSpeed() + ""; - } - - @Override - public String getModId(RotationStack ingredient) { - return "create"; - } - - @Override - public String getResourceId(RotationStack ingredient) { - return "rotation"; - } - - @Override - public RotationStack copyIngredient(RotationStack ingredient) { - return new RotationStack(ingredient.getSpeed()); - } - - @Override - public String getErrorInfo(@Nullable RotationStack ingredient) { - return "Error"; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/rotation/RotationIngredientRenderer.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/rotation/RotationIngredientRenderer.java deleted file mode 100644 index 9b631fb..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/rotation/RotationIngredientRenderer.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei.ingredients.rotation; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.AllItems; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.client.jei.ingredients.model.RotationStack; -import com.ticticboooom.mods.mm.client.jei.ingredients.model.StarlightStack; -import lombok.Setter; -import mezz.jei.api.gui.drawable.IDrawable; -import mezz.jei.api.gui.drawable.IDrawableStatic; -import mezz.jei.api.helpers.IJeiHelpers; -import mezz.jei.api.ingredients.IIngredientRenderer; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.model.ItemCameraTransforms; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.item.crafting.Ingredient; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; -import net.minecraftforge.common.util.Lazy; - -import javax.annotation.Nullable; -import java.util.List; - -public class RotationIngredientRenderer implements IIngredientRenderer { - @Setter - private IJeiHelpers helpers; - - @Override - public void render(MatrixStack matrixStack, int xPosition, int yPosition, @Nullable RotationStack ingredient) { - if (ingredient != null) { - IDrawableStatic drawable = helpers.getGuiHelper().createDrawable(new ResourceLocation(MM.ID, "textures/gui/slot_parts.png"), 1, 98, 16, 16); - drawable.draw(matrixStack, xPosition, yPosition); - } - } - - @Override - public List getTooltip(RotationStack ingredient, ITooltipFlag tooltipFlag) { - return Lists.newArrayList( - new StringTextComponent("Create Rotation"), - new StringTextComponent(ingredient.getSpeed() + " Speed") - ); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/rotation/RotationIngredientType.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/rotation/RotationIngredientType.java deleted file mode 100644 index 194c4ca..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/jei/ingredients/rotation/RotationIngredientType.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.ticticboooom.mods.mm.client.jei.ingredients.rotation; - -import com.ticticboooom.mods.mm.client.jei.ingredients.model.RotationStack; -import com.ticticboooom.mods.mm.client.jei.ingredients.model.StarlightStack; -import mezz.jei.api.ingredients.IIngredientType; - -public class RotationIngredientType implements IIngredientType { - @Override - public Class getIngredientClass() { - return RotationStack.class; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/screen/ControllerBlockContainerScreen.java b/src/main/java/com/ticticboooom/mods/mm/client/screen/ControllerBlockContainerScreen.java deleted file mode 100644 index ff4f81a..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/screen/ControllerBlockContainerScreen.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.ticticboooom.mods.mm.client.screen; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.container.ControllerBlockContainer; -import net.minecraft.client.gui.AbstractGui; -import net.minecraft.client.gui.screen.inventory.ContainerScreen; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.ITextComponent; - -public class ControllerBlockContainerScreen extends ContainerScreen { - private final ControllerBlockContainer container; - - public ControllerBlockContainerScreen(ControllerBlockContainer container, PlayerInventory p_i51105_2_, ITextComponent p_i51105_3_) { - super(container, p_i51105_2_, p_i51105_3_); - this.container = container; - } - - private static final ResourceLocation GUI = new ResourceLocation(MM.ID, "textures/gui/gui_large.png"); - - @Override - public void render(MatrixStack stack, int mouseX, int mouseY, float p_230430_4_) { - super.render(stack, mouseX, mouseY, p_230430_4_); - this.renderHoveredTooltip(stack, mouseX, mouseY); - } - - - @Override - protected void drawGuiContainerForegroundLayer(MatrixStack stack, int x0, int y0) { - this.minecraft.fontRenderer.func_238418_a_(container.getTile().getDisplayName(), 10, -10, 176, 0xfefefe); - drawString(stack, this.minecraft.fontRenderer, "Inventory", 7, 110, 0xfefefe); - int y = 50; - for (String s : container.getTile().getUpdate().getMsg().split("\n")) { - drawString(stack, this.minecraft.fontRenderer, s, 12, y, 0xfefefe); - y += 12; - } - } - - @Override - protected void drawGuiContainerBackgroundLayer(MatrixStack stack, float partialTicks, int x, int y) { - this.renderBackground(stack); - this.minecraft.textureManager.bindTexture(GUI); - this.blit(stack, this.guiLeft, this.guiTop - 20, 0, 0, 256, 256); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/screen/PortBlockContainerScreen.java b/src/main/java/com/ticticboooom/mods/mm/client/screen/PortBlockContainerScreen.java deleted file mode 100644 index 5634b0b..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/screen/PortBlockContainerScreen.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.ticticboooom.mods.mm.client.screen; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.container.ControllerBlockContainer; -import com.ticticboooom.mods.mm.block.container.PortBlockContainer; -import net.minecraft.client.gui.screen.inventory.ContainerScreen; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.ITextComponent; - -public class PortBlockContainerScreen extends ContainerScreen { - private static final ResourceLocation GUI = new ResourceLocation(MM.ID, "textures/gui/port_gui.png"); - - private final PortBlockContainer container; - - public PortBlockContainerScreen(PortBlockContainer container, PlayerInventory p_i51105_2_, ITextComponent p_i51105_3_) { - super(container, p_i51105_2_, p_i51105_3_); - this.container = container; - } - - @Override - public void render(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { - super.render(ms, mouseX, mouseY, partialTicks); - this.renderHoveredTooltip(ms, mouseX, mouseY); - } - - @Override - protected void drawGuiContainerBackgroundLayer(MatrixStack stack, float partialTicks, int x, int y) { - this.renderBackground(stack); - container.getTile().getStorage().render(stack, x, y, this.guiLeft, this.guiTop, this); - } - - @Override - protected void drawGuiContainerForegroundLayer(MatrixStack stack, int x, int y) { - drawString(stack, this.minecraft.fontRenderer, container.getTile().getDisplayName(), 7, 5, 0xfefefe); - drawString(stack, this.minecraft.fontRenderer, "Inventory", 7, 130, 0xfefefe); - } - -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/screen/StructureGenBlockContainerScreen.java b/src/main/java/com/ticticboooom/mods/mm/client/screen/StructureGenBlockContainerScreen.java deleted file mode 100644 index a477a1b..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/screen/StructureGenBlockContainerScreen.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.ticticboooom.mods.mm.client.screen; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.container.StructureGenBlockContainer; -import com.ticticboooom.mods.mm.helper.StructureHelper; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screen.inventory.ContainerScreen; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; - -public class StructureGenBlockContainerScreen extends ContainerScreen { - private final StructureGenBlockContainer cont; - - public StructureGenBlockContainerScreen(StructureGenBlockContainer cont, PlayerInventory p_i51105_2_, ITextComponent p_i51105_3_) { - super(cont, p_i51105_2_, p_i51105_3_); - this.cont = cont; - } - - @Override - public void render(MatrixStack ms, int p_230430_2_, int p_230430_3_, float p_230430_4_) { - super.render(ms, p_230430_2_, p_230430_3_, p_230430_4_); - this.renderHoveredTooltip(ms, p_230430_2_, p_230430_3_); - } - - @Override - protected void drawGuiContainerForegroundLayer(MatrixStack ms, int x, int y) { - this.minecraft.fontRenderer.func_238418_a_(new StringTextComponent("Structure Generator"), 10, -10, 176, 0xfefefe); - drawString(ms, this.minecraft.fontRenderer, "Inventory", 7, 107, 0xfefefe); - drawCenteredString(ms, this.minecraft.fontRenderer, "COPY TO CLIPBOARD", 80, 50, 0xfefefe); - } - - @Override - protected void drawGuiContainerBackgroundLayer(MatrixStack ms, float partialTicks, int x, int y) { - this.renderBackground(ms); - Minecraft.getInstance().textureManager.bindTexture(new ResourceLocation(MM.ID, "textures/gui/port_gui.png")); - blit(ms, guiLeft, guiTop - 20, 0, 0, 175, 256); - - Minecraft.getInstance().textureManager.bindTexture(new ResourceLocation(MM.ID, "textures/gui/slot_parts.png")); - blit(ms, guiLeft + 150, guiTop - 15, 0, 26, 18, 18); - } - - - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - int x = (int)mouseX - guiLeft; - int y = (int)mouseY - guiTop; - - if (x > 0 && x < 176 && y > 40 && y < 60){ - StructureHelper.copyToClickBoard(cont.getTile().getInv().getStackInSlot(0).getTag(), cont.getTile().getWorld()); - } - return super.mouseClicked(mouseX, mouseY, button); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/ter/StructureGenTileEntityRenderer.java b/src/main/java/com/ticticboooom/mods/mm/client/ter/StructureGenTileEntityRenderer.java deleted file mode 100644 index 6965558..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/ter/StructureGenTileEntityRenderer.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.ticticboooom.mods.mm.client.ter; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.vertex.IVertexBuilder; -import com.ticticboooom.mods.mm.block.tile.StructureGenBlockEntity; -import com.ticticboooom.mods.mm.client.MMRenderTypes; -import com.ticticboooom.mods.mm.helper.NBTHelper; -import com.ticticboooom.mods.mm.registration.MMSetup; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.tileentity.TileEntityRenderer; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.vector.Matrix4f; -import net.minecraft.util.math.vector.Quaternion; - -public class StructureGenTileEntityRenderer extends TileEntityRenderer { - public StructureGenTileEntityRenderer(TileEntityRendererDispatcher rendererDispatcherIn) { - super(rendererDispatcherIn); - } - - @Override - public void render(StructureGenBlockEntity tileEntityIn, float partialTicks, MatrixStack matrixStackIn, IRenderTypeBuffer bufferIn, int combinedLightIn, int combinedOverlayIn) { - ItemStack stackInSlot = tileEntityIn.getHandler().getStackInSlot(0); - if (stackInSlot.isEmpty()) { - return; - } - - if (stackInSlot.getItem() != MMSetup.STRUCTURE_DEVICE.get()) { - return; - } - - if (stackInSlot.getTag() == null){ - return; - } - - if (stackInSlot.getTag().contains("pos1") && stackInSlot.getTag().contains("pos2")) { - CompoundNBT pos1c = stackInSlot.getTag().getCompound("pos1"); - CompoundNBT pos2c = stackInSlot.getTag().getCompound("pos2"); - - BlockPos pos1 = NBTHelper.fromCompound(pos1c); - BlockPos pos2 = NBTHelper.fromCompound(pos2c); - BlockPos tilePos = tileEntityIn.getPos(); - - pos1 = pos1.subtract(tilePos); - pos2 = pos2.subtract(tilePos); - - IVertexBuilder builder = bufferIn.getBuffer(MMRenderTypes.OUTLINE); - matrixStackIn.push(); - Matrix4f mat = matrixStackIn.getLast().getMatrix(); - - float x = Math.min(pos1.getX(), pos2.getX()); - float y = Math.min(pos1.getY(), pos2.getY()); - float z = Math.min(pos1.getZ(), pos2.getZ()); - float dx = Math.max(pos1.getX(), pos2.getX()) + 1; - float dy = Math.max(pos1.getY(), pos2.getY()) + 1; - float dz = Math.max(pos1.getZ(), pos2.getZ()) + 1; - float xAdjust = addWiggleRoom(x,dx); - x = x+xAdjust; - dx = dx+(xAdjust*-1); - float yAdjust = addWiggleRoom(y,dy); - y = y+yAdjust; - dy = dy+(yAdjust*-1); - float zAdjust = addWiggleRoom(z,dz); - z = z+zAdjust; - dz = dz+(zAdjust*-1); - - int R = 255, G = 255, B = 255, A = 70; - builder.pos(mat, x , y, z).color(R, G, B, A).endVertex(); - builder.pos(mat, dx, y, z).color(R, G, B, A).endVertex(); - builder.pos(mat, dx, y, dz).color(R, G, B, A).endVertex(); - builder.pos(mat, x, y, dz).color(R, G, B, A).endVertex(); - - builder.pos(mat, x , dy, z).color(R, G, B, A).endVertex(); - builder.pos(mat, x, dy, dz).color(R, G, B, A).endVertex(); - builder.pos(mat, dx, dy, dz).color(R, G, B, A).endVertex(); - builder.pos(mat, dx, dy, z).color(R, G, B, A).endVertex(); - - builder.pos(mat, x , y, z).color(R, G, B, A).endVertex(); - builder.pos(mat, x, dy, z).color(R, G, B, A).endVertex(); - builder.pos(mat, dx, dy, z).color(R, G, B, A).endVertex(); - builder.pos(mat, dx, y, z).color(R, G, B, A).endVertex(); - - builder.pos(mat, x , y, dz).color(R, G, B, A).endVertex(); - builder.pos(mat, dx, y, dz).color(R, G, B, A).endVertex(); - builder.pos(mat, dx, dy, dz).color(R, G, B, A).endVertex(); - builder.pos(mat, x, dy, dz).color(R, G, B, A).endVertex(); - - builder.pos(mat, dx , y, z).color(R, G, B, A).endVertex(); - builder.pos(mat, dx, y, dz).color(R, G, B, A).endVertex(); - builder.pos(mat, dx, dy, dz).color(R, G, B, A).endVertex(); - builder.pos(mat, dx, dy, z).color(R, G, B, A).endVertex(); - - builder.pos(mat, x , y, z).color(R, G, B, A).endVertex(); - builder.pos(mat, x, y, dz).color(R, G, B, A).endVertex(); - builder.pos(mat, x, dy, dz).color(R, G, B, A).endVertex(); - builder.pos(mat, x, dy, z).color(R, G, B, A).endVertex(); - - matrixStackIn.pop(); - } - } - - private float addWiggleRoom(float coordOne, float coordTwo) { - if(coordOne > coordTwo) { - return 0.05f; - } - return -0.05f; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/util/FluidRenderer.java b/src/main/java/com/ticticboooom/mods/mm/client/util/FluidRenderer.java deleted file mode 100644 index ff58e85..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/util/FluidRenderer.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.ticticboooom.mods.mm.client.util; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.fluid.Fluid; -import net.minecraft.inventory.container.PlayerContainer; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.vector.Matrix4f; -import net.minecraftforge.fluids.FluidAttributes; -import net.minecraftforge.fluids.FluidStack; - -public class FluidRenderer { - - public static final FluidRenderer INSTANCE = new FluidRenderer(1000, 16, 16, 16); - private static final int TEX_WIDTH = 16; - private static final int TEX_HEIGHT = 16; - - private int capacity; - private final int width; - private final int height; - private final int minHeight; - - public FluidRenderer(int capacity, int width, int height, int minHeight) { - this.capacity = capacity; - this.width = width; - this.height = height; - this.minHeight = minHeight; - } - - public void render(MatrixStack matrixStack, final int xPosition, final int yPosition, FluidStack stack, final int height) { - RenderSystem.enableBlend(); - RenderSystem.enableAlphaTest(); - - drawFluid(matrixStack, xPosition, yPosition, stack, height); - - RenderSystem.color4f(1, 1, 1, 1); - - RenderSystem.disableAlphaTest(); - RenderSystem.disableBlend(); - } - - private void drawFluid(MatrixStack matrixStack, int xPosition, int yPosition, FluidStack stack, final int height) { - if (stack == null) { - return; - } - Fluid fluid = stack.getFluid(); - if (fluid == null) { - return; - } - - TextureAtlasSprite fluidStillSprite = getStillFluidSprite(stack); - - FluidAttributes attributes = fluid.getAttributes(); - int fluidColor = attributes.getColor(stack); - - int amount = stack.getAmount(); - - drawTiledSprite(matrixStack, xPosition, yPosition, width, height, fluidColor, height, fluidStillSprite); - } - - private void drawTiledSprite(MatrixStack matrixStack, int xPosition, int yPosition, int width, int height, int color, int scaledAmount, TextureAtlasSprite sprite) { - Minecraft minecraft = Minecraft.getInstance(); - minecraft.getTextureManager().bindTexture(PlayerContainer.LOCATION_BLOCKS_TEXTURE); - Matrix4f matrix = matrixStack.getLast().getMatrix(); - setGLColorFromInt(color); - - final int xTileCount = width / TEX_WIDTH; - final int xRemainder = height - (xTileCount * TEX_WIDTH); - final int yTileCount = scaledAmount / TEX_HEIGHT; - final int yRemainder = scaledAmount - (yTileCount * TEX_HEIGHT); - - final int yStart = yPosition + height; - - for (int xTile = 0; xTile <= xTileCount; xTile++) { - for (int yTile = 0; yTile <= yTileCount; yTile++) { - int w = (xTile == xTileCount) ? xRemainder : TEX_WIDTH; - int h = (yTile == yTileCount) ? yRemainder : TEX_HEIGHT; - int x = xPosition + (xTile * TEX_WIDTH); - int y = yStart - ((yTile + 1) * TEX_HEIGHT); - if (w > 0 && h > 0) { - int maskTop = TEX_HEIGHT - h; - int maskRight = TEX_WIDTH - w; - - drawTextureWithMasking(matrix, x, y, sprite, maskTop, maskRight, 100); - } - } - } - } - - private void drawTextureWithMasking(Matrix4f matrix, int x, int y, TextureAtlasSprite sprite, int maskTop, int maskRight, int z) { - float uMin = sprite.getMinU(); - float uMax = sprite.getMaxU(); - float vMin = sprite.getMinV(); - float vMax = sprite.getMaxV(); - uMax = uMax - (maskRight / 16F * (uMax - uMin)); - vMax = vMax - (maskTop / 16F * (vMax - vMin)); - - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder bufferBuilder = tessellator.getBuffer(); - bufferBuilder.begin(7, DefaultVertexFormats.POSITION_TEX); - bufferBuilder.pos(matrix, x, y + 16, z).tex(uMin, vMax).endVertex(); - bufferBuilder.pos(matrix, x + 16 - maskRight, y + 16, z).tex(uMax, vMax).endVertex(); - bufferBuilder.pos(matrix, x + 16 - maskRight, y + maskTop, z).tex(uMax, vMin).endVertex(); - bufferBuilder.pos(matrix, x, y + maskTop, z).tex(uMin, vMin).endVertex(); - tessellator.draw(); - } - - private static void setGLColorFromInt(int color) { - float red = (color >> 16 & 0xFF) / 255.0F; - float green = (color >> 8 & 0xFF) / 255.0F; - float blue = (color & 0xFF) / 255.0F; - float alpha = ((color >> 24) & 0xFF) / 255F; - - RenderSystem.color4f(red, green, blue, alpha); - } - - private TextureAtlasSprite getStillFluidSprite(FluidStack stack) { - Minecraft minecraft = Minecraft.getInstance(); - Fluid fluid = stack.getFluid(); - FluidAttributes attributes = fluid.getAttributes(); - ResourceLocation fluidStill = attributes.getStillTexture(stack); - return minecraft.getAtlasSpriteGetter(PlayerContainer.LOCATION_BLOCKS_TEXTURE).apply(fluidStill); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/util/GuiBlockRenderBuilder.java b/src/main/java/com/ticticboooom/mods/mm/client/util/GuiBlockRenderBuilder.java deleted file mode 100644 index ffa0e1c..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/client/util/GuiBlockRenderBuilder.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.ticticboooom.mods.mm.client.util; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.platform.GlStateManager; -import com.mojang.blaze3d.systems.RenderSystem; -import com.ticticboooom.mods.mm.client.jei.category.render.AirBlockReader; -import net.minecraft.block.BlockState; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BlockRendererDispatcher; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.renderer.RenderTypeLookup; -import net.minecraft.client.renderer.model.IBakedModel; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.client.renderer.tileentity.TileEntityRenderer; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.vector.Matrix4f; -import net.minecraft.util.math.vector.Quaternion; -import net.minecraft.util.math.vector.Vector3f; -import net.minecraftforge.client.model.data.EmptyModelData; - -import java.util.ArrayList; -import java.util.List; - -public class GuiBlockRenderBuilder { - private final BlockState blockState; - private BlockPos position; - private List orderedRotation = new ArrayList<>(); - private Minecraft mc = Minecraft.getInstance(); - private Vector3f scale; - private Vector3f prePosition = new Vector3f(); - private Vector3f positionOffset = new Vector3f(); - private TileEntityRenderer ter = null; - private TileEntity tile; - - public GuiBlockRenderBuilder(BlockState blockState) { - this.blockState = blockState; - position = new BlockPos(0, 0, 0); - try { - - AirBlockReader airBlockReader = new AirBlockReader(blockState); - tile = blockState.createTileEntity(airBlockReader); - airBlockReader.setTile(tile); - if (tile != null) { - ter = TileEntityRendererDispatcher.instance.getRenderer(tile); - } - } catch (Exception ignored) { - } - } - - public GuiBlockRenderBuilder at(BlockPos position) { - if (tile != null) { - tile.setWorldAndPos(Minecraft.getInstance().world, Minecraft.getInstance().player.getPosition()); - } - this.position = position; - return this; - } - - public GuiBlockRenderBuilder withRotation(Quaternion rotation) { - orderedRotation.add(rotation); - return this; - } - - public GuiBlockRenderBuilder withScale(Vector3f scale) { - this.scale = scale; - return this; - } - - public GuiBlockRenderBuilder withPrePosition(Vector3f position) { - this.prePosition = position; - return this; - } - - public GuiBlockRenderBuilder withOffset(Vector3f offset) { - this.positionOffset = offset; - return this; - } - - private void prepareRender() { -// RenderSystem.enableBlend(); -// RenderSystem.enableRescaleNormal(); -// RenderSystem.enableAlphaTest(); -// RenderHelper.setupGui3DDiffuseLighting(); -// RenderSystem.alphaFunc(516, 0.1F); -// RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); -// RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); - } - - private void cleanupRender() { -// RenderSystem.disableAlphaTest(); -// RenderSystem.disableRescaleNormal(); - } - - public void finalize(MatrixStack ms) { - prepareRender(); - IRenderTypeBuffer.Impl buf = mc.getRenderTypeBuffers().getBufferSource(); - BlockRendererDispatcher brd = Minecraft.getInstance().getBlockRendererDispatcher(); - ms.push(); - transformMatrix(ms); - - //brd.renderBlock(blockState, ms, buf, 0xF000F0, OverlayTexture.NO_OVERLAY, EmptyModelData.INSTANCE); - - // Copied the code to render block using a model from BlockRenderDispatcher#renderBlock for the case of model. - // Some blocks use ENTITYBLOCK_ANIMATED which is weird and I dont know how it works coz it only ever works on vanilla items, - // and I just dont know what to think about this honestly but this seems to work so I'm not touching it anymore unless something - // else decides to break in which case I will indeed come back to this and figure out a work around then. - IBakedModel model = brd.getModelForState(blockState); - int color = Minecraft.getInstance().getBlockColors().getColor(blockState, null, null, 0); - float r = (float) (color >> 16 & 255) / 255.0F; - float g = (float) (color >> 8 & 255) / 255.0F; - float b = (float) (color & 255) / 255.0F; - brd.getBlockModelRenderer().renderModel(ms.getLast(), buf.getBuffer(RenderTypeLookup.func_239220_a_(blockState, false)), blockState, model, r, g, b, 0xF000F0, OverlayTexture.NO_OVERLAY, EmptyModelData.INSTANCE); - - - ms.push(); - try { - if (ter != null) { - MatrixStack isolatedStack = new MatrixStack(); - isolatedStack.push(); - isolatedStack.getLast().getMatrix().set(ms.getLast().getMatrix().copy()); - isolatedStack.getLast().getNormal().set(ms.getLast().getNormal().copy()); - ter.render(tile, 1.f, isolatedStack, buf, 0xF000F0, OverlayTexture.NO_OVERLAY); - } - } catch (Exception ignored) { - } - buf.finish(); - ms.pop(); - ms.pop(); - cleanupRender(); - } - - private void transformMatrix(MatrixStack ms) { - ms.scale(12, -12, 12); - ms.translate(prePosition.getX(), prePosition.getY(), prePosition.getZ()); - for (Quaternion quaternion : orderedRotation) { - ms.rotate(quaternion); - } - ms.scale(scale.getX(), -scale.getY(), scale.getZ()); - ms.translate(position.getX() + positionOffset.getX(), position.getY() + positionOffset.getY(), position.getZ() + positionOffset.getZ()); - if (tile != null) { - //tile.setPos(new BlockPos(0, 0, 0)); - } - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/core/mixin/ResourceLoaderMixin.java b/src/main/java/com/ticticboooom/mods/mm/core/mixin/ResourceLoaderMixin.java deleted file mode 100644 index eac41fb..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/core/mixin/ResourceLoaderMixin.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2020 Ridanisaurus - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.ticticboooom.mods.mm.core.mixin; - -import com.ticticboooom.mods.mm.MM; -import net.minecraft.resources.ResourcePackInfo; -import net.minecraft.resources.ResourcePackList; -import net.minecraftforge.fml.loading.moddiscovery.ModFile; -import net.minecraftforge.fml.packs.ModFileResourcePack; -import net.minecraftforge.fml.packs.ResourcePackLoader; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.Map; -import java.util.function.BiConsumer; -import java.util.function.BiFunction; - -@Mixin(ResourcePackLoader.class) -public class ResourceLoaderMixin { - @Inject(method = "loadResourcePacks(Lnet/minecraft/resources/ResourcePackList;Ljava/util/function/BiFunction;)V", at = @At("RETURN"), remap = false) - private static void injectPacks(ResourcePackList resourcePacks, BiFunction, - BiConsumer, ResourcePackLoader.IPackInfoFinder> packFinder, CallbackInfo callback) { - - MM.injectDatapackFinder(resourcePacks); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/data/MachineProcessRecipe.java b/src/main/java/com/ticticboooom/mods/mm/data/MachineProcessRecipe.java deleted file mode 100644 index d5928ea..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/data/MachineProcessRecipe.java +++ /dev/null @@ -1,382 +0,0 @@ -package com.ticticboooom.mods.mm.data; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.exception.InvalidProcessDefinitionException; -import com.ticticboooom.mods.mm.helper.RLUtils; -import com.ticticboooom.mods.mm.model.ProcessUpdate; -import com.ticticboooom.mods.mm.ports.MasterfulPortType; -import com.ticticboooom.mods.mm.ports.state.PortState; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import com.ticticboooom.mods.mm.registration.MMPorts; -import com.ticticboooom.mods.mm.registration.RecipeTypes; -import lombok.Getter; -import lombok.SneakyThrows; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.IRecipeSerializer; -import net.minecraft.item.crafting.IRecipeType; -import net.minecraft.network.PacketBuffer; -import net.minecraft.util.ResourceLocation; -import net.minecraft.world.World; - -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -public class MachineProcessRecipe implements IRecipe { - - - @Getter - private final List inputs; - @Getter - private final List outputs; - @Getter - private int ticks; - @Getter - private String structureId; - private ResourceLocation rl; - - private List inputRolls = new ArrayList<>(); - private List outputRolls = new ArrayList<>(); - private Random rand = new Random(); - - public MachineProcessRecipe(List inputs, List outputs, int ticks, String structureId, ResourceLocation rl) { - this.inputs = inputs; - this.outputs = outputs; - this.ticks = ticks; - this.structureId = structureId; - this.rl = rl; - } - - public boolean matches(List inputPorts, String structureId, ProcessUpdate update) { - return structureId.equals(this.structureId) && canTake(inputPorts, update.getTakenIndices()); - } - - private boolean canTake(List inputPorts, List takenIndices) { - int i = -1; - for (PortState input : inputs) { - i++; - if (takenIndices.contains(i)) { - continue; - } - if (!input.isConsumePerTick()) { - if (!input.validateRequirement(inputPorts)) { - return false; - } - } - } - return true; - } - - private boolean canPut(List outputPorts) { - for (PortState output : outputs) { - if (!output.validateResult(outputPorts)) { - return false; - } - } - return true; - } - - private void resetChances() { - inputRolls.clear(); - outputRolls.clear(); - for (PortState input : inputs) { - if (input.supportsPerTick()) { - inputRolls.add(rand.nextDouble()); - } else { - inputRolls.add(1.0); - } - } - for (PortState output : outputs) { - if (output.supportsPerTick()) { - outputRolls.add(rand.nextDouble()); - } else { - outputRolls.add(1.0); - } - } - } - - public ProcessUpdate process(List inputPorts, List outputPorts, ProcessUpdate update) { - resetChances(); - boolean canTake = canTake(inputPorts, update.getTakenIndices()); - boolean canPut = canPut(outputPorts); - - if (!canTake || !canPut) { - update.setMsg("Found Structure"); - return update; - } - - int takenIndex = 0; - if (update.getTicksTaken() <= 0) { - for (PortState input : inputs) { - if (input.isInstantConsume() && input.validateRequirement(inputPorts)) { - update.getTakenIndices().add(takenIndex); - input.processRequirement(inputPorts); - } - takenIndex++; - } - } - - int index = 0; - if (update.getTicksTaken() >= ticks) { - update.getTakenIndices().clear(); - for (PortState input : inputs) { - if (input.isConsumePerTick() || input.isInstantConsume()) { - continue; - } - if (inputRolls.get(index) < input.getChance()) { - input.processRequirement(inputPorts); - index++; - } - } - index = 0; - for (PortState output : outputs) { - if (output.isConsumePerTick()) { - continue; - } - if (outputRolls.get(index) < output.getChance()) { - output.processResult(outputPorts); - } - } - update.setMsg(""); - update.setTicksTaken(0); - update.setTakenIndices(new ArrayList<>()); - return update; - } - - boolean canTick = true; - - - - - index = 0; - for (PortState input : inputs) { - if (input.isConsumePerTick()) { - if (inputRolls.get(index) < input.getChance()) { - if (!input.validateRequirement(inputPorts)) { - canTick = false; - } - } - } - } - index = 0; - for (PortState output : outputs) { - if (outputRolls.get(index) < output.getChance()) { - if (output.isConsumePerTick()) { - if (!output.validateResult(outputPorts)) { - canTick = false; - } - } - } - } - - if (canTick) { - for (PortState input : inputs) { - if (inputRolls.get(index) < input.getChance()) { - if (input.isConsumePerTick()) { - input.processRequirement(inputPorts); - } - } - } - for (PortState output : outputs) { - if (outputRolls.get(index) < output.getChance()) { - if (output.isConsumePerTick()) { - output.processResult(outputPorts); - } - } - } - update.setTicksTaken(update.getTicksTaken() + 1); - } - update.setMsg((int) (((float) update.getTicksTaken() / (float) ticks) * 100) + "%"); - return update; - } - - @Override - public boolean matches(IInventory p_77569_1_, World p_77569_2_) { - return false; - } - - @Override - public ItemStack getCraftingResult(IInventory inv) { - return null; - } - - @Override - public boolean canFit(int p_194133_1_, int p_194133_2_) { - return false; - } - - @Override - public ItemStack getRecipeOutput() { - return ItemStack.EMPTY; - } - - @Override - public ResourceLocation getId() { - return rl; - } - - @Override - public IRecipeSerializer getSerializer() { - return RecipeTypes.PROCESS.get(); - } - - @Override - public IRecipeType getType() { - return RecipeTypes.MACHINE_PROCESS; - } - - public static final class Serializer implements IRecipeSerializer { - - @Override - public MachineProcessRecipe read(ResourceLocation rl, JsonObject obj) { - try { - int ticks = obj.get("ticks").getAsInt(); - String structureId = obj.get("structureId").getAsString(); - JsonArray inputs = obj.get("inputs").getAsJsonArray(); - JsonArray outputs = obj.get("outputs").getAsJsonArray(); - - List inputStates = getStates(inputs); - List outputStates = getStates(outputs); - validateProcess(inputStates, outputStates, ticks, structureId, rl); - MM.LOG.debug("Added process '{}' for structure '{}'", rl, structureId); - return new MachineProcessRecipe(inputStates, outputStates, ticks, structureId, rl); - } catch (InvalidProcessDefinitionException e) { - MM.LOG.error("InvalidProcessDefinition: " + e.getMessage()); - } - return null; - } - - @SneakyThrows - private List getStates(JsonArray io) { - List ioStates = new ArrayList<>(); - for (JsonElement elem : io) { - JsonObject out = elem.getAsJsonObject(); - String type = out.get("type").getAsString(); - boolean perTick = false; - if (out.has("perTick")) { - perTick = out.get("perTick").getAsBoolean(); - } else if (out.has("consumePerTick")) { - perTick = out.get("consumePerTick").getAsBoolean(); - } - - ResourceLocation typeRl = RLUtils.toRL(type); - if (!MMPorts.PORTS.containsKey(typeRl)) { - throw new Exception(type + " is not a valid input type"); - } - - double chance = 1; - if (out.has("chance")) { - chance = out.get("chance").getAsDouble(); - } - - boolean consumeInstantly = false; - if (out.has("consumeInstantly")) { - consumeInstantly = out.get("consumeInstantly").getAsBoolean(); - } - - MasterfulPortType value = MMPorts.PORTS.get(typeRl); - PortState data = value.getParser().createState(out.get("data").getAsJsonObject()); - data.setConsumePerTick(perTick); - data.setChance(chance); - data.setInstantConsume(consumeInstantly); - ioStates.add(data); - } - return ioStates; - } - - - @Nullable - @Override - public MachineProcessRecipe read(ResourceLocation rl, PacketBuffer buf) { - int inputCount = buf.readInt(); - int outputCount = buf.readInt(); - int ticks = buf.readInt(); - String structureId = buf.readString(); - List inputs = getStates(buf, inputCount); - List outputs = getStates(buf, outputCount); - return new MachineProcessRecipe(inputs, outputs, ticks, structureId, rl); - } - - private List getStates(PacketBuffer buf, int count) { - List result = new ArrayList<>(); - for (int i = 0; i < count; i++) { - String inpType = buf.readString(); - boolean perTick = buf.readBoolean(); - double chance = buf.readDouble(); - MasterfulPortType value = MMPorts.PORTS.get(RLUtils.toRL(inpType)); - PortState state = value.getParser().createState(buf); - state.setConsumePerTick(perTick); - state.setChance(chance); - result.add(state); - } - return result; - } - - @Override - public void write(PacketBuffer buf, MachineProcessRecipe recipe) { - buf.writeInt(recipe.inputs.size()); - buf.writeInt(recipe.outputs.size()); - buf.writeInt(recipe.ticks); - buf.writeString(recipe.structureId); - - writeStates(buf, recipe.inputs); - writeStates(buf, recipe.outputs); - } - - private void writeStates(PacketBuffer buf, List states) { - for (PortState state : states) { - MasterfulPortType value = MMPorts.PORTS.get(state.getName()); - buf.writeString(value.getRegistryName().toString()); - buf.writeBoolean(state.isConsumePerTick()); - buf.writeDouble(state.getChance()); - value.getParser().write(buf, state); - } - } - - @Override - public IRecipeSerializer setRegistryName(ResourceLocation name) { - return this; - } - - @Override - public ResourceLocation getRegistryName() { - return new ResourceLocation(MM.ID, "machine_process"); - } - - @Override - public Class> getRegistryType() { - return RecipeTypes.PROCESS.get().getRegistryType(); - } - - - private void validateProcess(List inputs, List outputs, int ticks, String structureId, ResourceLocation rl) throws InvalidProcessDefinitionException { - for (PortState input : inputs) { - input.validateDefinition(); - commonValidate(input); - } - - for (PortState output : outputs) { - output.validateDefinition(); - commonValidate(output); - } - } - - private void commonValidate(PortState state) throws InvalidProcessDefinitionException { - if (!state.supportsChances() && state.getChance() != 1) { - throw new InvalidProcessDefinitionException("Port Type: " + state.getName() + " does not support chanced operations (chance)"); - } - if (state.getChance() < 0 || state.getChance() > 1) { - throw new InvalidProcessDefinitionException("Ingredient chance must be between 0 and 1"); - } - if (!state.supportsPerTick() && state.isConsumePerTick()) { - throw new InvalidProcessDefinitionException("Port Type: " + state.getName() + " does not support per tick operations (perTick)"); - } - } - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/data/MachineStructureRecipe.java b/src/main/java/com/ticticboooom/mods/mm/data/MachineStructureRecipe.java deleted file mode 100644 index 573eb42..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/data/MachineStructureRecipe.java +++ /dev/null @@ -1,384 +0,0 @@ -package com.ticticboooom.mods.mm.data; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.Codec; -import com.mojang.serialization.DataResult; -import com.mojang.serialization.JsonOps; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.ControllerBlock; -import com.ticticboooom.mods.mm.block.MachinePortBlock; -import com.ticticboooom.mods.mm.block.tile.IMachinePortTile; -import com.ticticboooom.mods.mm.data.model.structure.*; -import com.ticticboooom.mods.mm.exception.InvalidStructureDefinitionException; -import com.ticticboooom.mods.mm.helper.RLUtils; -import com.ticticboooom.mods.mm.registration.MMLoader; -import com.ticticboooom.mods.mm.registration.MMPorts; -import com.ticticboooom.mods.mm.registration.RecipeTypes; -import lombok.Getter; -import lombok.SneakyThrows; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.IRecipeSerializer; -import net.minecraft.item.crafting.IRecipeType; -import net.minecraft.network.PacketBuffer; -import net.minecraft.state.Property; -import net.minecraft.tags.BlockTags; -import net.minecraft.tags.ITag; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.vector.Vector3i; -import net.minecraft.world.World; -import net.minecraftforge.fml.RegistryObject; -import net.minecraftforge.registries.ForgeRegistries; - -import javax.annotation.Nullable; -import java.util.*; - -public class MachineStructureRecipe implements IRecipe { - private final ResourceLocation rl; - @Getter - private String name; - @Getter - private List> models; - @Getter - private final List controllerId; - private String id; - - public MachineStructureRecipe(List models, List controllerId, String id, ResourceLocation rl, String name) { - this.rl = rl; - this.name = name; - List rotated = new ArrayList<>(); - List rotated1 = new ArrayList<>(); - List rotated2 = new ArrayList<>(); - - for (MachineStructureRecipeKeyModel model : models) { - BlockPos rotatedPos = new BlockPos(model.getPos().getX(), model.getPos().getY(), model.getPos().getZ()).rotate(Rotation.CLOCKWISE_90); - BlockPos rotatedPos1 = new BlockPos(model.getPos().getX(), model.getPos().getY(), model.getPos().getZ()).rotate(Rotation.CLOCKWISE_180); - BlockPos rotatedPos2 = new BlockPos(model.getPos().getX(), model.getPos().getY(), model.getPos().getZ()).rotate(Rotation.COUNTERCLOCKWISE_90); - - rotated.add(new MachineStructureRecipeKeyModel(new MachineStructureBlockPos(rotatedPos.getX(), rotatedPos.getY(), rotatedPos.getZ()), model.getTag(), model.getBlock(), model.getProperties(), model.getPort())); - rotated1.add(new MachineStructureRecipeKeyModel(new MachineStructureBlockPos(rotatedPos1.getX(), rotatedPos1.getY(), rotatedPos1.getZ()), model.getTag(), model.getBlock(), model.getProperties(), model.getPort())); - rotated2.add(new MachineStructureRecipeKeyModel(new MachineStructureBlockPos(rotatedPos2.getX(), rotatedPos2.getY(), rotatedPos2.getZ()), model.getTag(), model.getBlock(), model.getProperties(), model.getPort())); - } - - this.models = new ArrayList<>(); - this.models.add(models); - this.models.add(rotated); - this.models.add(rotated1); - this.models.add(rotated2); - this.controllerId = controllerId; - this.id = id; - } - - @Override - public boolean matches(IInventory p_77569_1_, World p_77569_2_) { - return false; - } - - @Override - public ItemStack getCraftingResult(IInventory p_77572_1_) { - return null; - } - - @Override - public boolean canFit(int p_194133_1_, int p_194133_2_) { - return false; - } - - public int matches(BlockPos controllerPos, World world, String controllerId) { - if (!this.controllerId.contains(controllerId)) { - return -1; - } - - int index = 0; - for (List model : models) { - if (matchesWithRotation(controllerPos, world, model)) { - return index; - } - index++; - } - return -1; - } - - public boolean matchesWithRotation(BlockPos controllerPos, World world, List items) { - for (MachineStructureRecipeKeyModel model : items) { - if (!innerBlockMatch(controllerPos, world, model)) { - return false; - } - } - return true; - } - - - public boolean innerBlockMatch(BlockPos controllerPos, World world, MachineStructureRecipeKeyModel model) { - BlockPos pos = controllerPos.add(model.getPos().getX(), model.getPos().getY(), model.getPos().getZ()); - BlockState blockState = world.getBlockState(pos); - boolean valid = false; - if (!model.getTag().equals("")) { - String[] split = model.getTag().split(":"); - if (split.length != 2) { - MM.LOG.fatal("too many : (colons) in structure tag: {}", model.getTag()); - return false; - } - ITag tag = BlockTags.getCollection().get(new ResourceLocation(split[0], split[1])); - if (tag == null) { - MM.LOG.fatal("no existing block tag for structure tag: {}", model.getTag()); - return false; - } - valid = tag.contains(blockState.getBlock()); - } else if (!model.getBlock().equals("")) { - valid = blockState.getBlock().getRegistryName().toString().equals(model.getBlock()); - } else if (model.getPort() != null) { - MachineStructurePort structurePort = model.getPort(); - TileEntity portBlockEntity = world.getTileEntity(pos); - if (portBlockEntity instanceof IMachinePortTile && blockState.getBlock() instanceof MachinePortBlock) { - IMachinePortTile portTile = (IMachinePortTile) portBlockEntity; - MachinePortBlock portBlock = ((MachinePortBlock) blockState.getBlock()); - if (portTile.isInput() == structurePort.isInput() && - portBlock.getPortTypeId().equals(RLUtils.toRL(structurePort.getType()))) { - List controllerIds = structurePort.getControllerId() != null ? structurePort.getControllerId() : this.controllerId; - valid = controllerIds.contains(portBlock.getControllerId()); - } - } - } - - if (!valid) { - return false; - } - - if (model.getProperties() == null) { - return true; - } - - - for (Map.Entry stringStringEntry : model.getProperties().entrySet()) { - for (Map.Entry, Comparable> propertyEntry : blockState.getValues().entrySet()) { - if (propertyEntry.getKey().getName().equals(stringStringEntry.getKey())) { - Optional o = propertyEntry.getKey().parseValue(stringStringEntry.getValue()); - return propertyEntry.getValue().equals(o.get()); - } - } - } - - return false; - } - - public ArrayList getPorts(BlockPos controllerPos, World world, int index) { - ArrayList result = new ArrayList<>(); - for (MachineStructureRecipeKeyModel model : models.get(index)) { - BlockPos pos = controllerPos.add(model.getPos().toVector()); - BlockState state = world.getBlockState(pos); - if (state.getBlock() instanceof MachinePortBlock) { - result.add(pos); - } - } - return result; - } - - public String getStructureId() { - return id; - } - - @Override - public ItemStack getRecipeOutput() { - return ItemStack.EMPTY; - } - - @Override - public ResourceLocation getId() { - return rl; - } - - @Override - public IRecipeSerializer getSerializer() { - return RecipeTypes.STRUCTURE.get(); - } - - @Override - public IRecipeType getType() { - return RecipeTypes.MACHINE_STRUCTURE; - } - - public static final class Serializer implements IRecipeSerializer { - - - @Override - public MachineStructureRecipe read(ResourceLocation rl, JsonObject obj) { - try { - JsonElement controllerIdJson = obj.get("controllerId"); - List ids = new ArrayList<>(); - if (controllerIdJson.isJsonPrimitive()) { - ids.add(controllerIdJson.getAsString()); - } else { - for (JsonElement jsonElement : controllerIdJson.getAsJsonArray()) { - ids.add(jsonElement.getAsString()); - } - } - String id = obj.get("id").getAsString(); - String name = ""; - if (obj.has("name")) { - name = obj.get("name").getAsString(); - } else { - name = id; - } - DataResult>, JsonElement>> apply = JsonOps.INSTANCE.withDecoder(Codec.list(Codec.list(Codec.STRING))).apply(obj.getAsJsonArray("layout")); - List> layout = apply.result().get().getFirst(); - - List result = getResult(obj.getAsJsonObject("legend"), layout); - - validateStructure(result, ids, id, rl); - MM.LOG.debug("Added structure '{}' with id '{}'", rl, id); - return new MachineStructureRecipe(result, ids, id, rl, name); - } catch (InvalidStructureDefinitionException e) { - MM.LOG.error("InvalidStructureDefinition: " + e.getMessage()); - } - return null; - } - - private List getResult(JsonObject legend, List> layout) throws InvalidStructureDefinitionException { - HashMap model = new HashMap<>(); - for (Map.Entry entry : legend.entrySet()) { - DataResult> apply = JsonOps.INSTANCE.withDecoder(MachineStructureRecipeLegendModel.CODEC).apply(entry.getValue()); - MachineStructureRecipeLegendModel first = apply.result().get().getFirst(); - model.put(entry.getKey().charAt(0), first); - } - ArrayList result = new ArrayList<>(); - Vector3i controllerPos = getControllerPos(layout); - - int y = 0; - int z = 0; - for (List layer : layout) { - for (String row : layer) { - for (int x = 0; x < row.length(); x++) { - char c = row.charAt(x); - if (c == 'C') { - continue; - } - if (c == ' ') { - continue; - } - MachineStructureRecipeLegendModel machineStructureRecipeLegendModel = model.get(c); - BlockPos pos = new BlockPos(x, y, z).subtract(new BlockPos(controllerPos)); - result.add(new MachineStructureRecipeKeyModel(new MachineStructureBlockPos(pos.getX(), pos.getY(), pos.getZ()), machineStructureRecipeLegendModel.getTag(), machineStructureRecipeLegendModel.getBlock(), machineStructureRecipeLegendModel.getProperties(), machineStructureRecipeLegendModel.getPort())); - } - z++; - } - y++; - z = 0; - } - return result; - } - - private Vector3i getControllerPos(List> layout) throws InvalidStructureDefinitionException { - int y = 0; - int z = 0; - for (List layer : layout) { - for (String row : layer) { - for (int x = 0; x < row.length(); x++) { - if (row.charAt(x) == 'C') { - return new Vector3i(x, y, z); - } - } - z++; - } - y++; - z = 0; - } - throw new InvalidStructureDefinitionException("'C' AKA controller not found in layout section"); - } - - @SneakyThrows - @Nullable - @Override - public MachineStructureRecipe read(ResourceLocation rl, PacketBuffer buf) { - List controllerId = new ArrayList<>(); - int idCount = buf.readInt(); - for (int i = 0; i < idCount; i++) { - controllerId.add(buf.readString()); - } - String id = buf.readString(); - String name = buf.readString(); - try { - MachineStructureObject machineStructureObject = buf.func_240628_a_(MachineStructureObject.CODEC); - List models = machineStructureObject.getInner(); - return new MachineStructureRecipe(models, controllerId, id, rl, name); - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - @Override - public void write(PacketBuffer buf, MachineStructureRecipe recipe) { - buf.writeInt(recipe.controllerId.size()); - for (String s : recipe.controllerId) { - buf.writeString(s); - } - buf.writeString(recipe.id); - buf.writeString(recipe.name); - try { - buf.func_240629_a_(MachineStructureObject.CODEC, new MachineStructureObject(recipe.getModels().get(0))); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public IRecipeSerializer setRegistryName(ResourceLocation name) { - return this; - } - - @Override - public ResourceLocation getRegistryName() { - return new ResourceLocation(MM.ID, "machine_structure"); - } - - @Override - public Class> getRegistryType() { - return RecipeTypes.STRUCTURE.get().getRegistryType(); - } - - private void validateStructure(List models, List controllerId, String id, ResourceLocation rl) throws InvalidStructureDefinitionException { - for (MachineStructureRecipeKeyModel model : models) { - if (!model.getBlock().equals("")) { - if (RLUtils.isRL(model.getBlock())) { - if (!ForgeRegistries.BLOCKS.containsKey(RLUtils.toRL(model.getBlock()))) { - throw new InvalidStructureDefinitionException("Block: " + model.getBlock() + " is not an existing block in the game"); - } - } else { - throw new InvalidStructureDefinitionException("Block: " + model.getBlock() + " is defined but not a valid block id (ResourceLocation)"); - } - } else if (!model.getTag().equals("")) { - if (!RLUtils.isRL(model.getTag())) { - throw new InvalidStructureDefinitionException("Block Tag: " + model.getBlock() + " is defined but not a valid block tag id (ResourceLocation)"); - } - } else if (model.getPort() != null) { - if (!MMPorts.PORTS.containsKey(RLUtils.toRL(model.getPort().getType()))) { - throw new InvalidStructureDefinitionException("Port: " + model.getPort() + " is defined but not a valid port type id (ResourceLocation)"); - } else if (!controllerId.containsAll(model.getPort().getControllerId())) { - throw new InvalidStructureDefinitionException("Port: " + model.getPort() + " is defined but not a valid port controller id specified (ResourceLocation)"); - } - } else { - throw new InvalidStructureDefinitionException("You must define at least 1 'block' or 'tag' per port within the 'data' object"); - } - } - - for (String s : controllerId) { - boolean controllerIdFound = false; - for (RegistryObject block : MMLoader.BLOCKS) { - controllerIdFound = block.get().getControllerId().equals(s) || controllerIdFound; - } - if (!controllerIdFound) { - throw new InvalidStructureDefinitionException("controllerId: " + s + " does not exist"); - } - } - } - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/data/model/structure/MachineStructureBlockPos.java b/src/main/java/com/ticticboooom/mods/mm/data/model/structure/MachineStructureBlockPos.java deleted file mode 100644 index 397573d..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/data/model/structure/MachineStructureBlockPos.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.ticticboooom.mods.mm.data.model.structure; - -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import net.minecraft.util.math.vector.Vector3i; - -import java.util.Objects; - -@Getter -@AllArgsConstructor -public class MachineStructureBlockPos implements Comparable { - - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.INT.fieldOf("x").forGetter(z -> z.x), - Codec.INT.fieldOf("y").forGetter(z -> z.y), - Codec.INT.fieldOf("z").forGetter(z -> z.z) - ).apply(x, MachineStructureBlockPos::new)); - - private final int x; - private final int y; - private final int z; - - @Override - public int compareTo(MachineStructureBlockPos other) { - return toVector().compareTo(other.toVector()); - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - MachineStructureBlockPos that = (MachineStructureBlockPos) o; - return toVector().equals(that.toVector()); - } - - @Override - public int hashCode() { - return toVector().hashCode(); - } - - public Vector3i toVector(){ - return new Vector3i(this.x, this.y, this.z); - } -} \ No newline at end of file diff --git a/src/main/java/com/ticticboooom/mods/mm/data/model/structure/MachineStructureObject.java b/src/main/java/com/ticticboooom/mods/mm/data/model/structure/MachineStructureObject.java deleted file mode 100644 index 634d21c..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/data/model/structure/MachineStructureObject.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.ticticboooom.mods.mm.data.model.structure; - -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.List; - -@Getter -@AllArgsConstructor -public class MachineStructureObject { - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.list(MachineStructureRecipeKeyModel.CODEC).fieldOf("object").forGetter(z -> z.inner) - ).apply(x, MachineStructureObject::new)); - - private final List inner; -} diff --git a/src/main/java/com/ticticboooom/mods/mm/data/model/structure/MachineStructurePort.java b/src/main/java/com/ticticboooom/mods/mm/data/model/structure/MachineStructurePort.java deleted file mode 100644 index 80b4baa..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/data/model/structure/MachineStructurePort.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.ticticboooom.mods.mm.data.model.structure; - -import com.mojang.datafixers.util.Either; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.ToString; - -import java.util.Collections; -import java.util.List; -import java.util.Optional; -import java.util.function.Function; - -@ToString -@Getter -@AllArgsConstructor -public class MachineStructurePort { - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.STRING.fieldOf("type").forGetter(z -> z.type), - Codec.BOOL.fieldOf("input").forGetter(z -> z.input), - Codec.either(Codec.STRING, Codec.list(Codec.STRING)).xmap( - either -> either.map(Collections::singletonList, Function.identity()), - ids -> ids.size() == 1 ? Either.left(ids.get(0)) : Either.right(ids) - ).optionalFieldOf("controllerId").forGetter(z -> Optional.ofNullable(z.controllerId)) - ).apply(x, (w, y, z) -> new MachineStructurePort(w, y, z.orElse(null)))); - - private final String type; - private final boolean input; - private final List controllerId; -} diff --git a/src/main/java/com/ticticboooom/mods/mm/data/model/structure/MachineStructureRecipeKeyModel.java b/src/main/java/com/ticticboooom/mods/mm/data/model/structure/MachineStructureRecipeKeyModel.java deleted file mode 100644 index b431e2c..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/data/model/structure/MachineStructureRecipeKeyModel.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.ticticboooom.mods.mm.data.model.structure; - -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Map; -import java.util.Optional; - -@Getter -@AllArgsConstructor -public class MachineStructureRecipeKeyModel { - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - MachineStructureBlockPos.CODEC.fieldOf("pos").forGetter(z -> z.pos), - Codec.STRING.optionalFieldOf("tag").forGetter(z -> Optional.of(z.tag)), - Codec.STRING.optionalFieldOf("block").forGetter(z -> Optional.of(z.block)), - Codec.unboundedMap(Codec.STRING, Codec.STRING).optionalFieldOf("nbt").forGetter(z -> Optional.ofNullable(z.properties)), - MachineStructurePort.CODEC.optionalFieldOf("port").forGetter(z -> Optional.ofNullable(z.port)) - ).apply(x, (w0, w, y, z, z0) -> new MachineStructureRecipeKeyModel(w0, w.orElse(""), y.orElse(""), z.orElse(null), z0.orElse(null)))); - private MachineStructureBlockPos pos; - private final String tag; - private final String block; - private final Map properties; - private final MachineStructurePort port; - -} diff --git a/src/main/java/com/ticticboooom/mods/mm/data/model/structure/MachineStructureRecipeLegendModel.java b/src/main/java/com/ticticboooom/mods/mm/data/model/structure/MachineStructureRecipeLegendModel.java deleted file mode 100644 index 5144761..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/data/model/structure/MachineStructureRecipeLegendModel.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.ticticboooom.mods.mm.data.model.structure; - -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; - -import java.util.Map; -import java.util.Optional; - -@Getter -@AllArgsConstructor -public class MachineStructureRecipeLegendModel { - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.STRING.optionalFieldOf("tag").forGetter(z -> Optional.of(z.tag)), - Codec.STRING.optionalFieldOf("block").forGetter(z -> Optional.of(z.block)), - Codec.unboundedMap(Codec.STRING, Codec.STRING).optionalFieldOf("props").forGetter(z -> Optional.ofNullable(z.properties)), - MachineStructurePort.CODEC.optionalFieldOf("port").forGetter(z -> Optional.ofNullable(z.port)) - ).apply(x, (w, y, z, z0) -> new MachineStructureRecipeLegendModel(w.orElse(""), y.orElse(""), z.orElse(null), z0.orElse(null)))); - private final String tag; - private final String block; - @Setter - private Map properties; - private final MachineStructurePort port; -} diff --git a/src/main/java/com/ticticboooom/mods/mm/data/model/structure/MockedNamedTag.java b/src/main/java/com/ticticboooom/mods/mm/data/model/structure/MockedNamedTag.java deleted file mode 100644 index 0dceff4..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/data/model/structure/MockedNamedTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.ticticboooom.mods.mm.data.model.structure; - -import net.minecraft.tags.ITag; -import net.minecraft.util.ResourceLocation; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -public class MockedNamedTag implements ITag.INamedTag { - private final ResourceLocation name; - - public MockedNamedTag(ResourceLocation name) { - this.name = name; - } - - @Override - public ResourceLocation getName() { - return name; - } - - @Override - public boolean contains(T element) { - return false; - } - - @Override - public List getAllElements() { - return new ArrayList<>(); - } - - @Override - public T getRandomElement(Random random) { - return INamedTag.super.getRandomElement(random); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/datagen/DataGeneratorFactory.java b/src/main/java/com/ticticboooom/mods/mm/datagen/DataGeneratorFactory.java deleted file mode 100644 index 0de4504..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/datagen/DataGeneratorFactory.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2020 Ridanisaurus - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.ticticboooom.mods.mm.datagen; - -import com.google.common.collect.ImmutableList; -import net.minecraft.data.DataGenerator; -import net.minecraftforge.fml.loading.FMLPaths; - -import java.nio.file.Path; - -public class DataGeneratorFactory { - - public static Path ROOT_PATH; - - public static void init() { - ROOT_PATH = FMLPaths.CONFIGDIR.get().resolve("masterful_machinery/packs"); - } - - public static DataGenerator createMemoryDataGenerator() { - return new DataGenerator(ROOT_PATH, ImmutableList.of()); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/datagen/InMemoryPack.java b/src/main/java/com/ticticboooom/mods/mm/datagen/InMemoryPack.java deleted file mode 100644 index c767dca..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/datagen/InMemoryPack.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.ticticboooom.mods.mm.datagen; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.ticticboooom.mods.mm.MM; -import net.minecraft.resources.IResourcePack; -import net.minecraft.resources.ResourcePackType; -import net.minecraft.resources.data.IMetadataSectionSerializer; -import net.minecraft.util.JSONUtils; -import net.minecraft.util.ResourceLocation; - -import javax.annotation.Nullable; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.*; -import java.util.function.Predicate; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public class InMemoryPack implements IResourcePack { - private final Path path; - - public InMemoryPack(Path path) { - MM.generate(); - this.path = path; - } - - private static String getFullPath(ResourcePackType type, ResourceLocation location) { - return String.format("%s/%s/%s", type.getDirectoryName(), location.getNamespace(), location.getPath()); - } - - @Override - public InputStream getRootResourceStream(String fileName) throws IOException { - Path resolved = path.resolve(fileName); - return Files.newInputStream(resolved); - } - - @Override - public InputStream getResourceStream(ResourcePackType type, ResourceLocation location) throws IOException { - Path resolved = path.resolve(getFullPath(type, location)); - if (!Files.exists(resolved)){ - throw new IOException("Resource does not exist"); - } - return Files.newInputStream(resolved); - } - - @Override - public Collection getAllResourceLocations(ResourcePackType type, String namespaceIn, String pathIn, int maxDepthIn, Predicate filterIn) { - List result = new ArrayList<>(); - getChildResourceLocations(result, 0, maxDepthIn, filterIn, path.resolve(type.getDirectoryName() + "/" + namespaceIn + "/" + pathIn), namespaceIn, pathIn); - return result; - } - - private void getChildResourceLocations(List result, int depth, int maxDepth, Predicate filter, Path current, String currentRLNS, String currentRLPath) { - if (depth >= maxDepth) { - return; - } - try { - if (!Files.exists(current) || !Files.isDirectory(current)){ - return; - } - Stream list = Files.list(current); - for (Path child : list.collect(Collectors.toList())) { - if (!Files.isDirectory(child)) { - result.add(new ResourceLocation(currentRLNS, currentRLPath + "/" + child.getFileName())); - continue; - } - getChildResourceLocations(result, depth + 1, maxDepth, filter, child, currentRLNS, currentRLPath + "/" + child.getFileName()); - } - } catch (IOException ignored) { - ignored.printStackTrace(); - } - } - - - @Override - public boolean resourceExists(ResourcePackType type, ResourceLocation location) { - Path finalPath = path.resolve(type.getDirectoryName() + "/" + location.getNamespace() + "/" + location.getPath()); - return Files.exists(finalPath); - } - - @Override - public Set getResourceNamespaces(ResourcePackType type) { - Set result = new HashSet<>(); - try { - Stream list = Files.list(path.resolve(type.getDirectoryName())); - for (Path resultingPath : list.collect(Collectors.toList())) { - result.add(resultingPath.getFileName().toString()); - } - - } catch (IOException e) { - e.printStackTrace(); - } - return result; - } - - public T getMetadata(IMetadataSectionSerializer deserializer) throws IOException { - JsonObject jsonobject = new JsonObject(); - JsonObject packObject = new JsonObject(); - packObject.addProperty("pack_format", 6); - packObject.addProperty("description", "masterfulmachinery"); - jsonobject.add("pack", packObject); - if (!jsonobject.has(deserializer.getSectionName())) { - return null; - } else { - try { - return deserializer.deserialize(JSONUtils.getJsonObject(jsonobject, deserializer.getSectionName())); - } catch (JsonParseException jsonparseexception) { - return null; - } - } - } - - - @Override - public String getName() { - return "MM Memory Pack"; - } - - @Override - public void close() { - - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/datagen/MMPackFinder.java b/src/main/java/com/ticticboooom/mods/mm/datagen/MMPackFinder.java deleted file mode 100644 index 5b35f4e..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/datagen/MMPackFinder.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2020 Ridanisaurus - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.ticticboooom.mods.mm.datagen; - -import net.minecraft.resources.IPackFinder; -import net.minecraft.resources.IPackNameDecorator; -import net.minecraft.resources.ResourcePackInfo; - -import java.nio.file.Path; -import java.util.function.Consumer; - -public class MMPackFinder implements IPackFinder { - - - private final PackType type; - - public MMPackFinder(PackType type) { - - this.type = type; - } - - - @Override - public void findPacks(Consumer infoConsumer, ResourcePackInfo.IFactory infoFactory) { - Path rootPath = DataGeneratorFactory.ROOT_PATH; - - ResourcePackInfo pack = ResourcePackInfo.createResourcePack("mm_" + type.getSuffix(), true, - () -> new InMemoryPack(rootPath), infoFactory, ResourcePackInfo.Priority.BOTTOM, IPackNameDecorator.PLAIN); - if (pack != null) { - infoConsumer.accept(pack); - } - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/datagen/MockedNamedTag.java b/src/main/java/com/ticticboooom/mods/mm/datagen/MockedNamedTag.java deleted file mode 100644 index b37a1b2..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/datagen/MockedNamedTag.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.ticticboooom.mods.mm.datagen; - -import net.minecraft.tags.ITag; -import net.minecraft.util.ResourceLocation; - -import java.util.ArrayList; -import java.util.List; - -public class MockedNamedTag implements ITag.INamedTag { - private final ResourceLocation name; - - public MockedNamedTag(ResourceLocation name) { - this.name = name; - } - - @Override - public ResourceLocation getName() { - return name; - } - - @Override - public boolean contains(T element) { - return false; - } - - @Override - public List getAllElements() { - return new ArrayList<>(); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/datagen/PackType.java b/src/main/java/com/ticticboooom/mods/mm/datagen/PackType.java deleted file mode 100644 index 70b9c8a..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/datagen/PackType.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.ticticboooom.mods.mm.datagen; - -public enum PackType { - DATA("data"), - RESOURCE("resource") - ; - private final String suffix; - - PackType(String suffix) { - - this.suffix = suffix; - } - - public String getSuffix() { - return suffix; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/datagen/gen/runtime/BaseLootTableProvider.java b/src/main/java/com/ticticboooom/mods/mm/datagen/gen/runtime/BaseLootTableProvider.java deleted file mode 100644 index ac2cf92..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/datagen/gen/runtime/BaseLootTableProvider.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2020 Ridanisaurus - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.ticticboooom.mods.mm.datagen.gen.runtime; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.ticticboooom.mods.mm.MM; -import net.minecraft.advancements.criterion.EnchantmentPredicate; -import net.minecraft.advancements.criterion.ItemPredicate; -import net.minecraft.advancements.criterion.MinMaxBounds; -import net.minecraft.block.Block; -import net.minecraft.data.DataGenerator; -import net.minecraft.data.DirectoryCache; -import net.minecraft.data.IDataProvider; -import net.minecraft.data.LootTableProvider; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.Item; -import net.minecraft.loot.*; -import net.minecraft.loot.conditions.MatchTool; -import net.minecraft.loot.conditions.SurvivesExplosion; -import net.minecraft.loot.functions.ApplyBonus; -import net.minecraft.loot.functions.ExplosionDecay; -import net.minecraft.loot.functions.SetCount; -import net.minecraft.util.IItemProvider; -import net.minecraft.util.ResourceLocation; - -import java.io.IOException; -import java.nio.file.Path; -import java.util.HashMap; -import java.util.Map; - -public abstract class BaseLootTableProvider extends LootTableProvider { - - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create(); - - // Filled by subclasses - protected final Map blockLootTable = new HashMap<>(); - protected final Map itemLootTable = new HashMap<>(); - - private final DataGenerator generator; - - public BaseLootTableProvider(DataGenerator dataGeneratorIn) { - super(dataGeneratorIn); - this.generator = dataGeneratorIn; - } - - @Override - // Entry point - public void act(DirectoryCache cache) { - this.addTables(); - Map tables = new HashMap<>(); - for (Map.Entry entry : this.blockLootTable.entrySet()) { - tables.put(entry.getKey().getLootTable(), - entry.getValue().setParameterSet(LootParameterSets.BLOCK).build()); - } - - this.writeTables(cache, tables); - } - - @Override - public String getName() { - return "MM LootTables"; - } - - // Subclasses can override this to fill the 'lootTables' map. - protected abstract void addTables(); - - protected LootTable.Builder createBlockLootTable(Block block) { - LootPool.Builder builder = LootPool.builder() - .rolls(ConstantRange.of(1)) - .addEntry(ItemLootEntry.builder(block)) - .acceptCondition(SurvivesExplosion.builder()); - return LootTable.builder().addLootPool(builder); - } - - protected LootTable.Builder createItemLootTable(Item item) { - LootPool.Builder builder = LootPool.builder() - .rolls(ConstantRange.of(1)) - .addEntry(ItemLootEntry.builder(item)) - .acceptCondition(SurvivesExplosion.builder()); - return LootTable.builder().addLootPool(builder); - } - - protected LootTable.Builder createSpecialTable(Item item, IItemProvider itemProvider) { - LootPool.Builder builder = LootPool.builder() - .rolls(ConstantRange.of(1)) - .addEntry(ItemLootEntry.builder(item) - .acceptCondition(MatchTool.builder(ItemPredicate.Builder.create().enchantment(new EnchantmentPredicate(Enchantments.SILK_TOUCH, MinMaxBounds.IntBound.atLeast(1))))) - .alternatively(ItemLootEntry.builder(itemProvider) - .acceptFunction(ApplyBonus.oreDrops(Enchantments.FORTUNE)) - .acceptFunction(ExplosionDecay.builder()))); - return LootTable.builder().addLootPool(builder); - } - - protected LootTable.Builder createCountTable(Item item, IItemProvider itemProvider, float minCount, float maxCount) { - LootPool.Builder builder = LootPool.builder() - .rolls(ConstantRange.of(1)) - .addEntry(ItemLootEntry.builder(item) - .acceptCondition(MatchTool.builder(ItemPredicate.Builder.create().enchantment(new EnchantmentPredicate(Enchantments.SILK_TOUCH, MinMaxBounds.IntBound.atLeast(1))))) - .alternatively(ItemLootEntry.builder(itemProvider) - .acceptFunction(SetCount.builder(RandomValueRange.of(minCount, maxCount))) - .acceptFunction(ApplyBonus.oreDrops(Enchantments.FORTUNE)) - .acceptFunction(ExplosionDecay.builder()))); - return LootTable.builder().addLootPool(builder); - } - - // Actually write out the tables in the output folder - private void writeTables(DirectoryCache cache, Map tables) { - Path outputFolder = this.generator.getOutputFolder(); - tables.forEach((key, lootTable) -> { - Path path = outputFolder.resolve("data/" + key.getNamespace() + "/loot_tables/" + key.getPath() + ".json"); - try { - IDataProvider.save(GSON, cache, LootTableManager.toJson(lootTable), path); - } catch (IOException e) { - MM.LOG.error("Couldn't write loot table {}", path, e); - } - }); - } -} \ No newline at end of file diff --git a/src/main/java/com/ticticboooom/mods/mm/datagen/gen/runtime/MMBlockStateProvider.java b/src/main/java/com/ticticboooom/mods/mm/datagen/gen/runtime/MMBlockStateProvider.java deleted file mode 100644 index 0a1aef1..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/datagen/gen/runtime/MMBlockStateProvider.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.ticticboooom.mods.mm.datagen.gen.runtime; - -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.ControllerBlock; -import com.ticticboooom.mods.mm.block.MachinePortBlock; -import com.ticticboooom.mods.mm.helper.RLUtils; -import com.ticticboooom.mods.mm.ports.MasterfulPortType; -import com.ticticboooom.mods.mm.registration.MMLoader; -import com.ticticboooom.mods.mm.registration.MMPorts; -import com.ticticboooom.mods.mm.registration.MMSetup; -import net.minecraft.block.Block; -import net.minecraft.block.DirectionalBlock; -import net.minecraft.block.HorizontalBlock; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.data.DataGenerator; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.model.generators.BlockStateProvider; -import net.minecraftforge.client.model.generators.ModelBuilder; -import net.minecraftforge.client.model.generators.ModelFile; -import net.minecraftforge.client.model.generators.VariantBlockStateBuilder; -import net.minecraftforge.client.model.generators.loaders.MultiLayerModelBuilder; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.fml.RegistryObject; - -public class MMBlockStateProvider extends BlockStateProvider { - - - public MMBlockStateProvider(DataGenerator gen, ExistingFileHelper exFileHelper) { - super(gen, MM.ID, exFileHelper); - } - public static final ResourceLocation BASE_TEXTURE = new ResourceLocation(MM.ID, "block/base_block"); - private static final ResourceLocation CONTROLLER_TEXTURE = new ResourceLocation(MM.ID, "block/controller_cutout"); - - @Override - protected void registerStatesAndModels() { - for (RegistryObject controller : MMLoader.BLOCKS) { - if (!controller.isPresent()) { - return; - } - dynamicBlockNorthOverlay(controller.getId(), controller.get().getTexOverride() != null ? RLUtils.toRL(controller.get().getTexOverride()) : BASE_TEXTURE, CONTROLLER_TEXTURE); - VariantBlockStateBuilder variantBuilder = getVariantBuilder(controller.get()); - variantBuilder.partialState().with(DirectionalBlock.FACING, Direction.NORTH).modelForState().modelFile(new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + controller.getId().getPath()))).rotationY(0).addModel(); - variantBuilder.partialState().with(DirectionalBlock.FACING, Direction.SOUTH).modelForState().modelFile(new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + controller.getId().getPath()))).rotationY(180).addModel(); - variantBuilder.partialState().with(DirectionalBlock.FACING, Direction.EAST).modelForState().modelFile(new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + controller.getId().getPath()))).rotationY(90).addModel(); - variantBuilder.partialState().with(DirectionalBlock.FACING, Direction.WEST).modelForState().modelFile(new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + controller.getId().getPath()))).rotationY(270).addModel(); - variantBuilder.partialState().with(DirectionalBlock.FACING, Direction.UP).modelForState().modelFile(new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + controller.getId().getPath()))).rotationY(0).addModel(); - variantBuilder.partialState().with(DirectionalBlock.FACING, Direction.DOWN).modelForState().modelFile(new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + controller.getId().getPath()))).rotationY(0).addModel(); - } - - for (RegistryObject port : MMLoader.IPORT_BLOCKS) { - MasterfulPortType masterfulPortType = MMPorts.PORTS.get(port.get().getPortTypeId()); - masterfulPortType.getParser().generateBlockStates(this, true, port); - } - for (RegistryObject port : MMLoader.OPORT_BLOCKS) { - MasterfulPortType masterfulPortType = MMPorts.PORTS.get(port.get().getPortTypeId()); - masterfulPortType.getParser().generateBlockStates(this, false, port); - } - - directionalState(MMSetup.PROJECTOR_BLOCK.get()); - - directionalState(MMSetup.STRUCTURE_BLOCK.get()); - } - - public void dynamicBlockNorthOverlay(ResourceLocation loc, ResourceLocation baseTexture, ResourceLocation overlayTexture) { - models().getBuilder(loc.toString()).parent(new ModelFile.UncheckedModelFile(mcLoc("block/block"))) - .texture("particle", overlayTexture) - .transforms() - .transform(ModelBuilder.Perspective.THIRDPERSON_LEFT) - .rotation(75F, 45F, 0F) - .translation(0F, 2.5F, 0) - .scale(0.375F, 0.375F, 0.375F) - .end() - .transform(ModelBuilder.Perspective.THIRDPERSON_RIGHT) - .rotation(75F, 45F, 0F) - .translation(0F, 2.5F, 0) - .scale(0.375F, 0.375F, 0.375F) - .end() - .end() - .customLoader(MultiLayerModelBuilder::begin) - .submodel(RenderType.getSolid(), this.models().nested().parent(new ModelFile.UncheckedModelFile(mcLoc("block/block"))) - .texture("base", baseTexture) - .element() - .from(0, 0, 0) - .to(16, 16, 16) - .cube("#base") - //.allFaces((dir, uv) -> uv.uvs(0F,0.0F, 16F,16F)) - .end() - ) - .submodel(RenderType.getTranslucent(), this.models().nested().parent(new ModelFile.UncheckedModelFile(mcLoc("block/block"))) - .texture("overlay", overlayTexture) - .element() - .from(0, 0, 0) - .to(16, 16, 16) - .face(Direction.NORTH) - .texture("#overlay") - //.allFaces((dir, uv) -> uv.uvs(0F,0F, 16F,16F)) - .end() - .end() - ) - .end(); - } - - public void dynamicBlock(ResourceLocation loc, ResourceLocation baseTexture, ResourceLocation overlayTexture) { - models().getBuilder(loc.toString()).parent(new ModelFile.UncheckedModelFile(mcLoc("block/block"))) - .texture("particle", overlayTexture) - .transforms() - .transform(ModelBuilder.Perspective.THIRDPERSON_LEFT) - .rotation(75F, 45F, 0F) - .translation(0F, 2.5F, 0) - .scale(0.375F, 0.375F, 0.375F) - .end() - .transform(ModelBuilder.Perspective.THIRDPERSON_RIGHT) - .rotation(75F, 45F, 0F) - .translation(0F, 2.5F, 0) - .scale(0.375F, 0.375F, 0.375F) - .end() - .end() - .customLoader(MultiLayerModelBuilder::begin) - .submodel(RenderType.getSolid(), this.models().nested().parent(new ModelFile.UncheckedModelFile(mcLoc("block/block"))) - .texture("base", baseTexture) - .element() - .from(0, 0, 0) - .to(16, 16, 16) - .cube("#base") - //.allFaces((dir, uv) -> uv.uvs(0F,0.0F, 16F,16F)) - .end() - ) - .submodel(RenderType.getTranslucent(), this.models().nested().parent(new ModelFile.UncheckedModelFile(mcLoc("block/block"))) - .texture("overlay", overlayTexture) - .element() - .from(0, 0, 0) - .to(16, 16, 16) - .allFaces((dir, uv) -> uv.texture("#overlay")) - .end() - ) - .end(); - } - - - private void directionalState(Block block) { - VariantBlockStateBuilder variantBuilder = getVariantBuilder(block); - variantBuilder.partialState().with(HorizontalBlock.HORIZONTAL_FACING, Direction.NORTH).modelForState().modelFile(new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + block.getRegistryName().getPath()))).rotationY(0).addModel(); - variantBuilder.partialState().with(HorizontalBlock.HORIZONTAL_FACING, Direction.SOUTH).modelForState().modelFile(new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + block.getRegistryName().getPath()))).rotationY(180).addModel(); - variantBuilder.partialState().with(HorizontalBlock.HORIZONTAL_FACING, Direction.EAST).modelForState().modelFile(new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + block.getRegistryName().getPath()))).rotationY(90).addModel(); - variantBuilder.partialState().with(HorizontalBlock.HORIZONTAL_FACING, Direction.WEST).modelForState().modelFile(new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + block.getRegistryName().getPath()))).rotationY(270).addModel(); - - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/datagen/gen/runtime/MMItemModelProvider.java b/src/main/java/com/ticticboooom/mods/mm/datagen/gen/runtime/MMItemModelProvider.java deleted file mode 100644 index c176b82..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/datagen/gen/runtime/MMItemModelProvider.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.ticticboooom.mods.mm.datagen.gen.runtime; - -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.ControllerBlock; -import com.ticticboooom.mods.mm.block.MachinePortBlock; -import com.ticticboooom.mods.mm.helper.RLUtils; -import com.ticticboooom.mods.mm.registration.MMLoader; -import com.ticticboooom.mods.mm.registration.MMSetup; -import net.minecraft.data.DataGenerator; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.model.generators.ItemModelProvider; -import net.minecraftforge.client.model.generators.ModelFile; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.fml.RegistryObject; - -public class MMItemModelProvider extends ItemModelProvider { - - - public MMItemModelProvider(DataGenerator gen, ExistingFileHelper exFileHelper) { - super(gen, MM.ID, exFileHelper); - } - - @Override - protected void registerModels() { - for (RegistryObject controller : MMLoader.BLOCKS) { - if (!controller.isPresent()){ - return; - } - this.getBuilder(controller.getId().toString()).parent(new ModelFile.UncheckedModelFile(new ResourceLocation(controller.getId().getNamespace(), "block/" + controller.getId().getPath()))); - } - for (RegistryObject port : MMLoader.OPORT_BLOCKS) { - this.getBuilder(port.getId().toString()).parent(new ModelFile.UncheckedModelFile(new ResourceLocation(port.getId().getNamespace(), "block/" + port.getId().getPath()))); - } - for (RegistryObject port : MMLoader.IPORT_BLOCKS) { - this.getBuilder(port.getId().toString()).parent(new ModelFile.UncheckedModelFile(new ResourceLocation(port.getId().getNamespace(), "block/" + port.getId().getPath()))); - } - - this.getBuilder(MMSetup.BLUEPRINT.getId().getPath()).parent(new ModelFile.UncheckedModelFile("item/generated")).texture("layer0", "item/blueprint"); - this.getBuilder(MMSetup.STRUCTURE_DEVICE.getId().getPath()).parent(new ModelFile.UncheckedModelFile("item/generated")).texture("layer0", "item/scanning_tool"); - this.getBuilder(MMSetup.STRUCTURE_ITEM.getId().getPath()).parent(new ModelFile.UncheckedModelFile(RLUtils.toRL(MM.ID + ":block/structure_generator"))); - this.getBuilder(MMSetup.PROJECTOR_ITEM.getId().getPath()).parent(new ModelFile.UncheckedModelFile(RLUtils.toRL(MM.ID + ":block/" + MMSetup.PROJECTOR_BLOCK.getId().getPath()))); - } -} \ No newline at end of file diff --git a/src/main/java/com/ticticboooom/mods/mm/datagen/gen/runtime/MMLangProvider.java b/src/main/java/com/ticticboooom/mods/mm/datagen/gen/runtime/MMLangProvider.java deleted file mode 100644 index 4f2cbc1..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/datagen/gen/runtime/MMLangProvider.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.ticticboooom.mods.mm.datagen.gen.runtime; - -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.ControllerBlock; -import com.ticticboooom.mods.mm.block.MachinePortBlock; -import com.ticticboooom.mods.mm.registration.MMLoader; -import com.ticticboooom.mods.mm.registration.MMSetup; -import net.minecraft.data.DataGenerator; -import net.minecraftforge.common.data.LanguageProvider; -import net.minecraftforge.fml.RegistryObject; - -public class MMLangProvider extends LanguageProvider { - public MMLangProvider(DataGenerator gen) { - super(gen, MM.ID, "en_us"); - } - - @Override - protected void addTranslations() { - for (RegistryObject block : MMLoader.BLOCKS) { - if (!block.isPresent()){ - return; - } - this.add(block.get(), block.get().getControllerName() + " Controller"); - this.add("container.masterfulmachinery." + block.get().getControllerId() + "_controller.name", block.get().getControllerName() + " Controller"); - for (RegistryObject port : MMLoader.IPORT_BLOCKS) { - if (port.get().getControllerId().equals(block.get().getControllerId())){ - this.add(port.get(), block.get().getControllerName() + " - " + port.get().getLangName() + " Input Port"); - } - } - - for (RegistryObject port : MMLoader.OPORT_BLOCKS) { - if (port.get().getControllerId().equals(block.get().getControllerId())) { - this.add(port.get(), block.get().getControllerName() + " - " + port.get().getLangName() + " Output Port"); - } - } - - } - if (!MMSetup.BLUEPRINT.isPresent()){ - return; - } - this.add(MMSetup.BLUEPRINT.get(), "Blueprint"); - this.add(MMSetup.STRUCTURE_DEVICE.get(), "Structure Selector"); - this.add(MMSetup.PROJECTOR_BLOCK.get(), "Structure Projector"); - this.add(MMSetup.STRUCTURE_BLOCK.get(), "Structure Generator"); - this.add("container.masterfulmachinery.create_rotation", "Rotation Port"); - this.add("itemGroup.masterfulmachinery", "Masterful Machinery"); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/datagen/gen/runtime/MMLootTableProvider.java b/src/main/java/com/ticticboooom/mods/mm/datagen/gen/runtime/MMLootTableProvider.java deleted file mode 100644 index 70d3490..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/datagen/gen/runtime/MMLootTableProvider.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.ticticboooom.mods.mm.datagen.gen.runtime; - -import com.ticticboooom.mods.mm.block.ControllerBlock; -import com.ticticboooom.mods.mm.block.MachinePortBlock; -import com.ticticboooom.mods.mm.registration.MMLoader; -import com.ticticboooom.mods.mm.registration.MMSetup; -import net.minecraft.data.DataGenerator; -import net.minecraftforge.fml.RegistryObject; -import net.minecraftforge.registries.ForgeRegistries; - -public class MMLootTableProvider extends BaseLootTableProvider { - public MMLootTableProvider(DataGenerator dataGeneratorIn) { - super(dataGeneratorIn); - } - - @Override - protected void addTables() { - for (RegistryObject controller : MMLoader.BLOCKS) { - if (!controller.isPresent()){ - return; - } - blockLootTable.put(controller.get(), createItemLootTable(ForgeRegistries.ITEMS.getValue(controller.getId()))); - } - - for (RegistryObject port : MMLoader.IPORT_BLOCKS) { - blockLootTable.put(port.get(), createItemLootTable(ForgeRegistries.ITEMS.getValue(port.getId()))); - } - for (RegistryObject port : MMLoader.OPORT_BLOCKS) { - blockLootTable.put(port.get(), createItemLootTable(ForgeRegistries.ITEMS.getValue(port.getId()))); - } - - blockLootTable.put(MMSetup.PROJECTOR_BLOCK.get(), createCountTable(MMSetup.PROJECTOR_ITEM.get(), MMSetup.PROJECTOR_ITEM.get(), 1, 1)); - blockLootTable.put(MMSetup.STRUCTURE_BLOCK.get(), createBlockLootTable(MMSetup.STRUCTURE_BLOCK.get())); - - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/event/ConstructEventHandler.java b/src/main/java/com/ticticboooom/mods/mm/event/ConstructEventHandler.java deleted file mode 100644 index 22a03b7..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/event/ConstructEventHandler.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.ticticboooom.mods.mm.event; - -import com.ticticboooom.mods.mm.registration.MMLoader; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLConstructModEvent; - -@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) -public class ConstructEventHandler { - @SubscribeEvent - public static void onConstruct(FMLConstructModEvent event) { - MMLoader.load(); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/exception/InvalidProcessDefinitionException.java b/src/main/java/com/ticticboooom/mods/mm/exception/InvalidProcessDefinitionException.java deleted file mode 100644 index 6221454..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/exception/InvalidProcessDefinitionException.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.ticticboooom.mods.mm.exception; - -public class InvalidProcessDefinitionException extends Exception { - public InvalidProcessDefinitionException(String message) { - super(message); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/exception/InvalidStructureDefinitionException.java b/src/main/java/com/ticticboooom/mods/mm/exception/InvalidStructureDefinitionException.java deleted file mode 100644 index 6fd214b..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/exception/InvalidStructureDefinitionException.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.ticticboooom.mods.mm.exception; - -public class InvalidStructureDefinitionException extends Exception { - public InvalidStructureDefinitionException(String message) { - super(message); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/helper/GLScissor.java b/src/main/java/com/ticticboooom/mods/mm/helper/GLScissor.java deleted file mode 100644 index 377e393..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/helper/GLScissor.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.ticticboooom.mods.mm.helper; - -//once again robbed kindly from https://github.com/vincentmetevelis/CustomQuests2/blob/1.16.5-2.1.0/src/main/java/com/vincentmet/customquests/helpers/rendering/GLScissor.java Thanks Vince ;) - - -import net.minecraft.client.*; -import net.minecraftforge.api.distmarker.*; -import org.lwjgl.opengl.GL11; -import static org.lwjgl.opengl.GL11.*; - -@OnlyIn(Dist.CLIENT) -public class GLScissor{ - public static void enable(int x, int y, int width, int height){ - MainWindow mw = Minecraft.getInstance().getMainWindow(); - double s = mw.getGuiScaleFactor(); - - if(width<0)width=0; - if(height<0)height=0; - if(x<0)x=0; - if(y<0)y=0; - GL11.glPushMatrix(); - glEnable(GL_SCISSOR_TEST); - glScissor( - (int)(x * s), - (int)(mw.getFramebufferHeight() - ((double)(y + height) * s)), - (int)(width * s), - (int)(height * s) - ); - } - - public static void disable(){ - glDisable(GL_SCISSOR_TEST); - GL11.glPopMatrix(); - } - - public static boolean isEnabled(){ - return glIsEnabled(GL_SCISSOR_TEST); - } -} \ No newline at end of file diff --git a/src/main/java/com/ticticboooom/mods/mm/helper/GuiHelper.java b/src/main/java/com/ticticboooom/mods/mm/helper/GuiHelper.java deleted file mode 100644 index 43e7340..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/helper/GuiHelper.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.ticticboooom.mods.mm.helper; - -import com.mojang.blaze3d.matrix.MatrixStack; -import net.minecraft.client.gui.screen.Screen; - -public class GuiHelper { - - public static void renderVerticallyFilledBar(MatrixStack ms, Screen screen, int x, int y, int u, int v, int width, int height, float pct) { - float invPct = 1 - pct; - screen.blit(ms, x, y + (int) (height * invPct), u, v + (int) (height * invPct), width, (int) (height * pct)); - } - -} diff --git a/src/main/java/com/ticticboooom/mods/mm/helper/IOHelper.java b/src/main/java/com/ticticboooom/mods/mm/helper/IOHelper.java deleted file mode 100644 index 5bc8849..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/helper/IOHelper.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.ticticboooom.mods.mm.helper; - -import com.ticticboooom.mods.mm.MM; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; - -public class IOHelper { - public static File getFileAndCreate(Path path) { - if (!Files.exists(path)) { - try { - Files.createDirectories(path); - } catch (IOException e) { - e.printStackTrace(); - MM.LOG.fatal("failed to create path: {}", path.toAbsolutePath()); - } - } - return path.toFile(); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/helper/InvHelper.java b/src/main/java/com/ticticboooom/mods/mm/helper/InvHelper.java deleted file mode 100644 index a227ab2..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/helper/InvHelper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.ticticboooom.mods.mm.helper; - -import com.ticticboooom.mods.mm.inventory.ItemStackInventory; -import net.minecraft.inventory.Inventory; -import net.minecraftforge.items.ItemStackHandler; - -public class InvHelper { - public static ItemStackInventory getItems(ItemStackHandler handler){ - return new ItemStackInventory(handler); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/helper/NBTHelper.java b/src/main/java/com/ticticboooom/mods/mm/helper/NBTHelper.java deleted file mode 100644 index f218290..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/helper/NBTHelper.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.ticticboooom.mods.mm.helper; - -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.math.BlockPos; -import org.lwjgl.system.CallbackI; - -public class NBTHelper { - public static CompoundNBT toCompound(BlockPos pos) { - CompoundNBT result = new CompoundNBT(); - result.putInt("x", pos.getX()); - result.putInt("y", pos.getY()); - result.putInt("z", pos.getZ()); - return result; - } - - public static BlockPos fromCompound(CompoundNBT nbt) { - int x = nbt.getInt("x"); - int y = nbt.getInt("y"); - int z = nbt.getInt("z"); - return new BlockPos(x, y, z); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/helper/RLUtils.java b/src/main/java/com/ticticboooom/mods/mm/helper/RLUtils.java deleted file mode 100644 index 5bd6cb4..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/helper/RLUtils.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.ticticboooom.mods.mm.helper; - -import net.minecraft.util.ResourceLocation; - -public class RLUtils { - public static ResourceLocation toRL(String str) { - return ResourceLocation.tryCreate(str); - } - - public static boolean isRL(String str) { - return ResourceLocation.tryCreate(str) != null; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/helper/StructureHelper.java b/src/main/java/com/ticticboooom/mods/mm/helper/StructureHelper.java deleted file mode 100644 index 2117ccf..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/helper/StructureHelper.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.ticticboooom.mods.mm.helper; - -import com.google.gson.*; -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.Codec; -import com.mojang.serialization.DataResult; -import com.mojang.serialization.JsonOps; -import com.ticticboooom.mods.mm.block.ControllerBlock; -import com.ticticboooom.mods.mm.registration.MMLoader; -import net.minecraft.block.BlockState; -import net.minecraft.client.Minecraft; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.vector.Vector3i; -import net.minecraft.world.World; -import net.minecraftforge.fml.RegistryObject; - -import java.util.*; - -public class StructureHelper { - static String allChars; - - static { - int[] codePoints = new int[0x110000]; - for (int i = 0; i < codePoints.length; i++) { - - codePoints[i] = i; - } - - allChars = new String(codePoints, 0, codePoints.length); - } - - private static Gson GSON = null; - - public static void copyToClickBoard(CompoundNBT tag, World world) { - if (tag == null) { - return; - } - - if (!tag.contains("pos1") || !tag.contains("pos2")) { - return; - } - - BlockPos pos1 = NBTHelper.fromCompound(tag.getCompound("pos1")); - BlockPos pos2 = NBTHelper.fromCompound(tag.getCompound("pos2")); - - int x = Math.min(pos1.getX(), pos2.getX()); - int y = Math.min(pos1.getY(), pos2.getY()); - int z = Math.min(pos1.getZ(), pos2.getZ()); - int dx = Math.max(pos1.getX(), pos2.getX()); - int dy = Math.max(pos1.getY(), pos2.getY()); - int dz = Math.max(pos1.getZ(), pos2.getZ()); - - BlockPos minPos = new BlockPos(x, y, z); - BlockPos maxPos = new BlockPos(dx, dy, dz); - - List> layout = new ArrayList<>(); - Map legend = new HashMap<>(); - Map legendLookup = new HashMap<>(); - - char index = 41; - - for (int yi = minPos.getY(); yi <= maxPos.getY(); yi++) { - ArrayList strings = new ArrayList<>(); - for (int zi = minPos.getZ(); zi <= maxPos.getZ(); zi++) { - StringBuilder row = new StringBuilder(); - for (int xi = minPos.getX(); xi <= maxPos.getX(); xi++) { - BlockState state = world.getBlockState(new BlockPos(xi, yi, zi)); - ResourceLocation registryName = state.getBlock().getRegistryName(); - - if (index == 'C'){ - index++; - } - - if (state.isAir()) { - row.append(" "); - continue; - } - - if (state.getBlock() instanceof ControllerBlock) { - row.append('C'); - continue; - } - - if (!legendLookup.containsKey(registryName)) { - legend.put(index, registryName); - legendLookup.put(registryName, index); - index++; - } - row.append(legendLookup.get(registryName)); - } - strings.add(row.toString()); - } - layout.add(strings); - } - - JsonObject jsonObject = toJson(legend, layout); - String s = new GsonBuilder() - .setPrettyPrinting() - .disableHtmlEscaping() - .create().toJson(jsonObject); - Minecraft.getInstance().keyboardListener.setClipboardString(s); - } - - private static JsonObject toJson(Map legend, List> layout) { - JsonObject result = new JsonObject(); - result.addProperty("type", "masterfulmachinery:machine_structure"); - result.addProperty("id", "change_this"); - result.addProperty("controllerId", "change_this"); - result.addProperty("name", "Change This"); - - DataResult apply = JsonOps.INSTANCE.withEncoder(Codec.list(Codec.list(Codec.STRING))).apply(layout); - JsonArray layoutJson = apply.result().get().getAsJsonArray(); - - result.add("layout", layoutJson); - JsonObject legendJson = new JsonObject(); - for (Map.Entry entry : legend.entrySet()) { - JsonObject inner = new JsonObject(); - inner.addProperty("block", entry.getValue().toString()); - legendJson.add(entry.getKey().toString(), inner); - } - - result.add("legend", legendJson); - - return result; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/inventory/ItemStackInventory.java b/src/main/java/com/ticticboooom/mods/mm/inventory/ItemStackInventory.java deleted file mode 100644 index 4c5d95d..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/inventory/ItemStackInventory.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.ticticboooom.mods.mm.inventory; - -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraftforge.items.ItemStackHandler; - -public class ItemStackInventory implements IInventory { - - private ItemStackHandler handler; - - public ItemStackInventory(ItemStackHandler handler) { - - this.handler = handler; - } - - @Override - public int getSizeInventory() { - return handler.getSlots(); - } - - @Override - public boolean isEmpty() { - return false; - } - - @Override - public ItemStack getStackInSlot(int p_70301_1_) { - return handler.getStackInSlot(p_70301_1_); - } - - @Override - public ItemStack decrStackSize(int p_70298_1_, int p_70298_2_) { - ItemStack stackInSlot = handler.getStackInSlot(p_70298_1_); - handler.setStackInSlot(p_70298_1_, ItemStack.EMPTY); - return stackInSlot; - } - - @Override - public ItemStack removeStackFromSlot(int p_70304_1_) { - return handler.getStackInSlot(p_70304_1_); - } - - @Override - public void setInventorySlotContents(int p_70299_1_, ItemStack p_70299_2_) { - handler.setStackInSlot(p_70299_1_, p_70299_2_); - } - - @Override - public void markDirty() { - - } - - @Override - public boolean isUsableByPlayer(PlayerEntity player) { - return true; - } - - @Override - public void clear() { - - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/inventory/PortEnergyInventory.java b/src/main/java/com/ticticboooom/mods/mm/inventory/PortEnergyInventory.java deleted file mode 100644 index 3578888..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/inventory/PortEnergyInventory.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.ticticboooom.mods.mm.inventory; - -import net.minecraft.nbt.CompoundNBT; -import net.minecraftforge.energy.IEnergyStorage; - -public class PortEnergyInventory implements IEnergyStorage { - - private int stored; - private int capacity; - public PortEnergyInventory(int stored, int capacity) { - - this.stored = stored; - this.capacity = capacity; - } - - @Override - public int receiveEnergy(int maxReceive, boolean simulate) { - if (simulate) { - if ((long)maxReceive + stored > capacity) { - return (stored + maxReceive - capacity); - } else { - return maxReceive; - } - } - if ((long)maxReceive + stored > capacity) { - int result = (stored + maxReceive - capacity); - stored = capacity; - return result; - } else { - stored += maxReceive; - return maxReceive; - } - } - - @Override - public int extractEnergy(int maxExtract, boolean simulate) { - if (simulate) { - if (stored - maxExtract < 0) { - return stored; - } else { - return maxExtract; - } - } - if (stored - maxExtract < 0) { - int result = stored; - stored = 0; - return result; - } else { - stored -= maxExtract; - return maxExtract; - } - } - - @Override - public int getEnergyStored() { - return stored; - } - - @Override - public int getMaxEnergyStored() { - return capacity; - } - - @Override - public boolean canExtract() { - return stored > 0; - } - - @Override - public boolean canReceive() { - return stored < capacity; - } - - public void setStored(int amount) { - this.stored = amount; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/inventory/PortFluidInventory.java b/src/main/java/com/ticticboooom/mods/mm/inventory/PortFluidInventory.java deleted file mode 100644 index 442f857..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/inventory/PortFluidInventory.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.ticticboooom.mods.mm.inventory; - -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.IFluidHandler; - -import javax.annotation.Nonnull; - -public class PortFluidInventory implements IFluidHandler { - - private FluidStack stack = FluidStack.EMPTY; - private final int capacity; - public PortFluidInventory(int capacity) { - this.capacity = capacity; - } - - @Override - public int getTanks() { - return 1; - } - - @Nonnull - @Override - public FluidStack getFluidInTank(int tank) { - return tank != 0 ? FluidStack.EMPTY : stack.copy(); - } - - @Override - public int getTankCapacity(int tank) { - return tank != 0 ? 0 : capacity; - } - - @Override - public boolean isFluidValid(int tank, @Nonnull FluidStack stack) { - return tank == 0 && (this.stack.isEmpty() || stack.isFluidEqual(this.stack)); - } - - @Override - public int fill(FluidStack resource, FluidAction action) { - if (!stack.isEmpty() && !resource.isFluidEqual(stack)) { - return 0; - } - if (action == FluidAction.SIMULATE) { - if ((long)resource.getAmount() + stack.getAmount() > capacity) { - return resource.getAmount() - (stack.getAmount() + resource.getAmount() - capacity); - } else { - return resource.getAmount(); - } - } - - if ((long)resource.getAmount() + stack.getAmount() > capacity) { - int preAmount = stack.getAmount(); - if (stack.isEmpty()) { - stack = new FluidStack(resource.getFluid(), capacity); - } else { - stack.setAmount(capacity); - } - return resource.getAmount() - (preAmount + resource.getAmount() - capacity); - } else { - if (stack.isEmpty()) { - stack = new FluidStack(resource.getFluid(), resource.getAmount()); - } else { - stack.setAmount(stack.getAmount() + resource.getAmount()); - } - return resource.getAmount(); - } - } - - @Nonnull - @Override - public FluidStack drain(FluidStack resource, FluidAction action) { - if (!stack.isEmpty() && !resource.isFluidEqual(stack)) { - return FluidStack.EMPTY; - } - return innerDrain(resource.getAmount(), action == FluidAction.SIMULATE); - } - - @Nonnull - @Override - public FluidStack drain(int maxDrain, FluidAction action) { - return innerDrain(maxDrain, action == FluidAction.SIMULATE); - } - - private FluidStack innerDrain(int amount, boolean simulate) { - if (simulate) { - if (stack.getAmount() - amount <= 0) { - return stack.copy(); - } else { - return new FluidStack(stack.getFluid(), amount); - } - } - - if (stack.getAmount() - amount <= 0) { - FluidStack preStack = stack.copy(); - stack.setAmount(0); - return preStack; - } else { - stack.setAmount(stack.getAmount() - amount); - return new FluidStack(stack.getFluid(), amount); - } - } - - public void setStack(FluidStack stack) { - this.stack = stack; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/inventory/as/IStarlightStorage.java b/src/main/java/com/ticticboooom/mods/mm/inventory/as/IStarlightStorage.java deleted file mode 100644 index b2e795c..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/inventory/as/IStarlightStorage.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.ticticboooom.mods.mm.inventory.as; - -public interface IStarlightStorage { - /** - * Adds starlight to the storage. Returns quantity of starlight that was accepted. - * - * @param maxReceive - * Maximum amount of starlight to be inserted. - * @param simulate - * If TRUE, the insertion will only be simulated. - * @return Amount of starlight that was (or would have been, if simulated) accepted by the storage. - */ - int receiveStarlight(int maxReceive, boolean simulate); - - /** - * Removes starlight from the storage. Returns quantity of starlight that was removed. - * - * @param maxExtract - * Maximum amount of starlight to be extracted. - * @param simulate - * If TRUE, the extraction will only be simulated. - * @return Amount of starlight that was (or would have been, if simulated) extracted from the storage. - */ - int extractStarlight(int maxExtract, boolean simulate); - - /** - * Returns the amount of starlight currently stored. - */ - int getStarlightStored(); - - /** - * Returns the maximum amount of starlight that can be stored. - */ - int getMaxStarlightStored(); - - /** - * Returns if this storage can have starlight extracted. - * If this is false, then any calls to extractStarlight will return 0. - */ - boolean canExtract(); - - /** - * Used to determine if this storage can receive starlight. - * If this is false, then any calls to receivestarlight will return 0. - */ - boolean canReceive(); -} diff --git a/src/main/java/com/ticticboooom/mods/mm/inventory/as/MMIndependentStarlightSource.java b/src/main/java/com/ticticboooom/mods/mm/inventory/as/MMIndependentStarlightSource.java deleted file mode 100644 index e2b14a1..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/inventory/as/MMIndependentStarlightSource.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.ticticboooom.mods.mm.inventory.as; - -import com.ticticboooom.mods.mm.block.tile.AstralMachinePortBlockEntity; -import com.ticticboooom.mods.mm.ports.storage.StarlightPortStorage; -import hellfirepvp.astralsorcery.AstralSorcery; -import hellfirepvp.astralsorcery.common.block.base.BlockStarlightRecipient; -import hellfirepvp.astralsorcery.common.constellation.Constellation; -import hellfirepvp.astralsorcery.common.constellation.IConstellation; -import hellfirepvp.astralsorcery.common.constellation.IWeakConstellation; -import hellfirepvp.astralsorcery.common.lib.ConstellationsAS; -import hellfirepvp.astralsorcery.common.starlight.IIndependentStarlightSource; -import hellfirepvp.astralsorcery.common.starlight.transmission.registry.SourceClassRegistry; -import hellfirepvp.astralsorcery.common.util.nbt.NBTHelper; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.server.ServerWorld; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.Map; - -public class MMIndependentStarlightSource implements IIndependentStarlightSource { - - private StarlightPortStorage storage; - IWeakConstellation attunedConstellation = null; - - - @Override - public float produceStarlightTick(ServerWorld serverWorld, BlockPos blockPos) { - if (storage == null){ - return 0; - } - return storage.getInv().extractStarlight(Integer.MAX_VALUE, false); - } - - @Nullable - @Override - public IWeakConstellation getStarlightType() { - return ConstellationsAS.aevitas; - } - - @Override - public void threadedUpdateProximity(BlockPos blockPos, Map map) { - - } - - @Override - public SourceClassRegistry.SourceProvider getProvider() { - return new Provider(); - } - - @Override - public void readFromNBT(CompoundNBT compound) { - this.attunedConstellation = NBTHelper.readOptional(compound, "constellation", (nbt) -> { - IConstellation cst = IConstellation.readFromNBT(nbt); - if (cst instanceof IWeakConstellation) { - return (IWeakConstellation) cst; - } - return null; - }); - } - - @Override - public void writeToNBT(CompoundNBT compound) { - NBTHelper.writeOptional(compound, "constellation", this.attunedConstellation, (nbt, cst) -> cst.writeToNBT(nbt)); - } - - @Override - public boolean updateFromTileEntity(T tile) { - if (tile instanceof AstralMachinePortBlockEntity) { - AstralMachinePortBlockEntity astralTile = (AstralMachinePortBlockEntity) tile; - attunedConstellation = astralTile.getAttunedConstellation(); - storage = (StarlightPortStorage) astralTile.getStorage(); - } - return true; - } - - public static class Provider implements SourceClassRegistry.SourceProvider { - - @Override - public IIndependentStarlightSource provideEmptySource() { - return new MMIndependentStarlightSource(); - } - - @Override - @Nonnull - public ResourceLocation getIdentifier() { - return AstralSorcery.key("mm_independent_source"); - } - - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/inventory/as/MMSimpleTransmissionReceiver.java b/src/main/java/com/ticticboooom/mods/mm/inventory/as/MMSimpleTransmissionReceiver.java deleted file mode 100644 index 0d8b53d..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/inventory/as/MMSimpleTransmissionReceiver.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.ticticboooom.mods.mm.inventory.as; - -import com.ticticboooom.mods.mm.block.tile.AstralMachineInputPortBlockEntity; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import com.ticticboooom.mods.mm.ports.storage.StarlightPortStorage; -import hellfirepvp.astralsorcery.common.constellation.IWeakConstellation; -import hellfirepvp.astralsorcery.common.starlight.transmission.IPrismTransmissionNode; -import hellfirepvp.astralsorcery.common.starlight.transmission.base.SimpleTransmissionReceiver; -import hellfirepvp.astralsorcery.common.starlight.transmission.registry.TransmissionProvider; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class MMSimpleTransmissionReceiver extends SimpleTransmissionReceiver { - - - private AstralMachineInputPortBlockEntity astralMachineInputPortBlockEntity; - - public MMSimpleTransmissionReceiver(BlockPos thisPos) { - super(thisPos); - } - - @Override - public boolean syncTileData(World world, AstralMachineInputPortBlockEntity astralMachineInputPortBlockEntity) { - this.astralMachineInputPortBlockEntity = astralMachineInputPortBlockEntity; - return true; - } - - @Override - public Class getTileClass() { - return AstralMachineInputPortBlockEntity.class; - } - - @Override - public void onStarlightReceive(World world, IWeakConstellation iWeakConstellation, double v) { - AstralMachineInputPortBlockEntity tileAtPos = this.getTileAtPos(world); - if (tileAtPos == null){ - return; - } - PortStorage storage = tileAtPos.getStorage(); - if (storage instanceof StarlightPortStorage) { - ((StarlightPortStorage) storage).getInv().receiveStarlight((int)v, false); - } - } - - @Override - public TransmissionProvider getProvider() { - return new Provider(); - } - - public static final class Provider extends TransmissionProvider { - - @Override - public IPrismTransmissionNode get() { - return new MMSimpleTransmissionReceiver(null); - } - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/inventory/as/PortStarlightInventory.java b/src/main/java/com/ticticboooom/mods/mm/inventory/as/PortStarlightInventory.java deleted file mode 100644 index 6137323..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/inventory/as/PortStarlightInventory.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.ticticboooom.mods.mm.inventory.as; - -public class PortStarlightInventory implements IStarlightStorage { - - private int stored; - private int capacity; - public PortStarlightInventory(int stored, int capacity) { - - this.stored = stored; - this.capacity = capacity; - } - - @Override - public int receiveStarlight(int maxReceive, boolean simulate) { - if (simulate) { - if ((long)maxReceive + stored > capacity) { - return (stored + maxReceive - capacity); - } else { - return maxReceive; - } - } - if ((long)maxReceive + stored > capacity) { - int result = (stored + maxReceive - capacity); - stored = capacity; - return result; - } else { - stored += maxReceive; - return maxReceive; - } - } - - @Override - public int extractStarlight(int maxExtract, boolean simulate) { - if (simulate) { - if ((long)stored - maxExtract < 0) { - return stored; - } else { - return maxExtract; - } - } - if ((long)stored - maxExtract < 0) { - int result = stored; - stored = 0; - return result; - } else { - stored -= maxExtract; - return maxExtract; - } - } - - @Override - public int getStarlightStored() { - return stored; - } - - @Override - public int getMaxStarlightStored() { - return capacity; - } - - @Override - public boolean canExtract() { - return stored > 0; - } - - @Override - public boolean canReceive() { - return stored < capacity; - } - - public void setStored(int amount) { - this.stored = amount; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/inventory/botania/IManaStorage.java b/src/main/java/com/ticticboooom/mods/mm/inventory/botania/IManaStorage.java deleted file mode 100644 index 0112aea..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/inventory/botania/IManaStorage.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.ticticboooom.mods.mm.inventory.botania; - -public interface IManaStorage { - /** - * Adds Mana to the storage. Returns quantity of Mana that was accepted. - * - * @param maxReceive - * Maximum amount of Mana to be inserted. - * @param simulate - * If TRUE, the insertion will only be simulated. - * @return Amount of Mana that was (or would have been, if simulated) accepted by the storage. - */ - int receiveMana(int maxReceive, boolean simulate); - - /** - * Removes Mana from the storage. Returns quantity of Mana that was removed. - * - * @param maxExtract - * Maximum amount of Mana to be extracted. - * @param simulate - * If TRUE, the extraction will only be simulated. - * @return Amount of Mana that was (or would have been, if simulated) extracted from the storage. - */ - int extractMana(int maxExtract, boolean simulate); - - /** - * Returns the amount of Mana currently stored. - */ - int getManaStored(); - - /** - * Returns the maximum amount of Mana that can be stored. - */ - int getMaxManaStored(); - - /** - * Returns if this storage can have Mana extracted. - * If this is false, then any calls to extractMana will return 0. - */ - boolean canExtract(); - - /** - * Used to determine if this storage can receive Mana. - * If this is false, then any calls to receiveMana will return 0. - */ - boolean canReceive(); -} diff --git a/src/main/java/com/ticticboooom/mods/mm/inventory/botania/PortManaInventory.java b/src/main/java/com/ticticboooom/mods/mm/inventory/botania/PortManaInventory.java deleted file mode 100644 index cc2a5e9..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/inventory/botania/PortManaInventory.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.ticticboooom.mods.mm.inventory.botania; - -public class PortManaInventory implements IManaStorage { - - private int stored; - private int capacity; - public PortManaInventory(int stored, int capacity) { - - this.stored = stored; - this.capacity = capacity; - } - - @Override - public int receiveMana(int maxReceive, boolean simulate) { - if (simulate) { - if ((long)maxReceive + stored > capacity) { - return maxReceive - (stored + maxReceive - capacity); - } else { - return maxReceive; - } - } - if ((long)maxReceive + stored > capacity) { - int result = maxReceive - (stored + maxReceive - capacity); - stored = capacity; - return result; - } else { - stored += maxReceive; - return maxReceive; - } - } - - @Override - public int extractMana(int maxExtract, boolean simulate) { - if (simulate) { - if (stored - maxExtract < 0) { - return stored; - } else { - return maxExtract; - } - } - if (stored - maxExtract < 0) { - int result = stored; - stored = 0; - return result; - } else { - stored -= maxExtract; - return maxExtract; - } - } - - @Override - public int getManaStored() { - return stored; - } - - @Override - public int getMaxManaStored() { - return capacity; - } - - @Override - public boolean canExtract() { - return stored > 0; - } - - @Override - public boolean canReceive() { - return stored < capacity; - } - - public void setStored(int amount) { - this.stored = amount; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/inventory/mek/MekChemicalInventory.java b/src/main/java/com/ticticboooom/mods/mm/inventory/mek/MekChemicalInventory.java deleted file mode 100644 index c15d179..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/inventory/mek/MekChemicalInventory.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.ticticboooom.mods.mm.inventory.mek; - -import mekanism.api.Action; -import mekanism.api.chemical.Chemical; -import mekanism.api.chemical.ChemicalStack; -import mekanism.api.chemical.IChemicalHandler; -import mekanism.api.chemical.IChemicalTank; -import mekanism.api.chemical.gas.GasStack; -import net.minecraft.nbt.CompoundNBT; - -import javax.annotation.Nonnull; -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.function.Supplier; - -public class MekChemicalInventory, STACK extends ChemicalStack> implements IChemicalHandler, IChemicalTank { - private STACK stack; - private STACK empty; - private BiFunction factory; - private long capacity; - - public MekChemicalInventory(STACK empty, long capacity, BiFunction factory) { - this.stack = (STACK) empty.copy(); - this.capacity = capacity; - this.empty = empty; - this.factory = factory; - } - - @Override - public int getTanks() { - return 1; - } - - @Override - public STACK getChemicalInTank(int i) { - return stack; - } - - @Override - public void setChemicalInTank(int i, STACK stack) { - if (i == 0){ - this.stack = stack; - } - } - - @Override - public long getTankCapacity(int i) { - return capacity; - } - - @Override - public boolean isValid(int i, STACK stack) { - if (i != 0){ - return false; - } - return this.stack.isEmpty() || stack.getType() == this.stack.getType(); - } - - @Override - public STACK insertChemical(int i, STACK stack, Action action) { - if (!isValid(i, stack)) { - return empty; - } - - if (action.simulate()) { - if (this.stack.getAmount() + stack.getAmount() > capacity) { - return factory.apply(stack.getType(), (this.stack.getAmount() + stack.getAmount() - capacity)); - } else { - return this.empty; - } - } - - if (this.stack.getAmount() + stack.getAmount() > capacity) { - long preAmount = this.stack.getAmount(); - if (this.stack.isEmpty()){ - this.stack = factory.apply(stack.getType(), capacity); - } else { - this.stack.setAmount(capacity); - } - return factory.apply(stack.getType(), (preAmount + stack.getAmount() - capacity)); - } else { - if (this.stack.isEmpty()) { - this.stack = factory.apply(stack.getType(), stack.getAmount()); - } else { - this.stack.setAmount(this.stack.getAmount() + stack.getAmount()); - } - return this.empty; - } - } - - @Override - public STACK extractChemical(int i, long l, Action action) { - if (action.simulate()) { - if (stack.getAmount() - l < 0) { - return factory.apply(stack.getType(), l - (l - stack.getAmount())); - } else { - return factory.apply(stack.getType(), l); - } - } - - if (stack.getAmount() - l < 0) { - long preAmount = stack.getAmount(); - this.stack = empty; - return factory.apply(stack.getType(),l - (l - preAmount)); - } else { - stack.setAmount(stack.getAmount() - l); - return factory.apply(stack.getType(), l); - } - } - - @Nonnull - @Override - public STACK getEmptyStack() { - return empty; - } - - @Override - public STACK createStack(STACK stack, long l) { - return factory.apply(stack.getType(), l); - } - - @Override - public STACK getStack() { - return stack; - } - - @Override - public void setStack(STACK stack) { - this.stack = stack; - } - - @Override - public void setStackUnchecked(STACK stack) { - this.stack = stack; - } - - @Override - public long getCapacity() { - return capacity; - } - - @Override - public boolean isValid(STACK stack) { - return isValid(0, stack); - } - - @Override - public void onContentsChanged() { - - } - - @Override - public void deserializeNBT(CompoundNBT nbt) { - - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/inventory/mek/MekanismContentsListener.java b/src/main/java/com/ticticboooom/mods/mm/inventory/mek/MekanismContentsListener.java deleted file mode 100644 index cc3db97..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/inventory/mek/MekanismContentsListener.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.ticticboooom.mods.mm.inventory.mek; - -import mekanism.api.IContentsListener; - -public class MekanismContentsListener implements IContentsListener { - @Override - public void onContentsChanged() { - - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/inventory/mek/PortMekGasInventory.java b/src/main/java/com/ticticboooom/mods/mm/inventory/mek/PortMekGasInventory.java deleted file mode 100644 index 8ebd558..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/inventory/mek/PortMekGasInventory.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.ticticboooom.mods.mm.inventory.mek; - -import mekanism.api.chemical.gas.Gas; -import mekanism.api.chemical.gas.GasStack; -import mekanism.api.chemical.gas.IGasHandler; - -public class PortMekGasInventory extends MekChemicalInventory implements IGasHandler { - - public PortMekGasInventory(long capacity) { - super(GasStack.EMPTY, capacity, GasStack::new); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/inventory/mek/PortMekInfuseInventory.java b/src/main/java/com/ticticboooom/mods/mm/inventory/mek/PortMekInfuseInventory.java deleted file mode 100644 index a677646..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/inventory/mek/PortMekInfuseInventory.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.ticticboooom.mods.mm.inventory.mek; - -import mekanism.api.chemical.infuse.IInfusionHandler; -import mekanism.api.chemical.infuse.InfuseType; -import mekanism.api.chemical.infuse.InfusionStack; - -public class PortMekInfuseInventory extends MekChemicalInventory implements IInfusionHandler { - - public PortMekInfuseInventory(long capacity) { - super(InfusionStack.EMPTY, capacity, InfusionStack::new); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/inventory/mek/PortMekSlurryInventory.java b/src/main/java/com/ticticboooom/mods/mm/inventory/mek/PortMekSlurryInventory.java deleted file mode 100644 index 2414f83..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/inventory/mek/PortMekSlurryInventory.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.ticticboooom.mods.mm.inventory.mek; - -import mekanism.api.chemical.slurry.ISlurryHandler; -import mekanism.api.chemical.slurry.ISlurryTank; -import mekanism.api.chemical.slurry.Slurry; -import mekanism.api.chemical.slurry.SlurryStack; - -public class PortMekSlurryInventory extends MekChemicalInventory implements ISlurryHandler, ISlurryTank { - public PortMekSlurryInventory(long capacity) { - super(SlurryStack.EMPTY, capacity, SlurryStack::new); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/item/StructureGenSelectionDevice.java b/src/main/java/com/ticticboooom/mods/mm/item/StructureGenSelectionDevice.java deleted file mode 100644 index 5e93402..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/item/StructureGenSelectionDevice.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.ticticboooom.mods.mm.item; - -import com.ticticboooom.mods.mm.helper.NBTHelper; -import com.ticticboooom.mods.mm.registration.MMLoader; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemUseContext; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.ActionResult; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.world.World; - -public class StructureGenSelectionDevice extends Item { - public StructureGenSelectionDevice() { - super(new Item.Properties().group(MMLoader.MASTERFUL_ITEM_GROUP)); - } - - - @Override - public ActionResultType onItemUse(ItemUseContext ctx) { - BlockPos clickedPos = ctx.getPos(); - ItemStack iih = ctx.getItem(); - CompoundNBT tag = iih.getTag(); - if (tag == null) { - tag = new CompoundNBT(); - } - if (!tag.contains("pos1") && !tag.contains("pos2")) { - tag.put("pos1", NBTHelper.toCompound(clickedPos)); - ctx.getPlayer().sendStatusMessage(new StringTextComponent("Set Pos 1"), true); - } else if (tag.contains("pos1") && !tag.contains("pos2")) { - tag.put("pos2", NBTHelper.toCompound(clickedPos)); - ctx.getPlayer().sendStatusMessage(new StringTextComponent("Set Pos 2"), true); - } else { - if (tag.contains("pos2")) { - tag.remove("pos2"); - } - tag.put("pos1", NBTHelper.toCompound(clickedPos)); - ctx.getPlayer().sendStatusMessage(new StringTextComponent("Set Pos 1"), true); - } - iih.setTag(tag); - - return ActionResultType.SUCCESS; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/model/JEIIngredientWrapper.java b/src/main/java/com/ticticboooom/mods/mm/model/JEIIngredientWrapper.java deleted file mode 100644 index c5f1e1d..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/model/JEIIngredientWrapper.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.ticticboooom.mods.mm.model; - -import lombok.Getter; -import mezz.jei.api.ingredients.IIngredientType; - -import java.util.ArrayList; -import java.util.List; - -public class JEIIngredientWrapper { - @Getter - List stacks = new ArrayList<>(); - - public void add(IIngredientType type, TStack stack) { - stacks.add(stack); - } - - public void add(IIngredientType type, List stack) { - stacks.addAll(stack); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/model/ModelOverrideModel.java b/src/main/java/com/ticticboooom/mods/mm/model/ModelOverrideModel.java deleted file mode 100644 index 8790a25..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/model/ModelOverrideModel.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.ticticboooom.mods.mm.model; - -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Optional; - -@Getter -@AllArgsConstructor -public class ModelOverrideModel { - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.STRING.optionalFieldOf("commonModel").forGetter(z -> z.commonModel), - Codec.STRING.optionalFieldOf("inputModel").forGetter(z -> z.inputModel), - Codec.STRING.optionalFieldOf("outputModel").forGetter(z -> z.outputModel) - ).apply(x, ModelOverrideModel::new)); - - private final Optional commonModel; - private final Optional inputModel; - private final Optional outputModel; -} diff --git a/src/main/java/com/ticticboooom/mods/mm/model/ProcessUpdate.java b/src/main/java/com/ticticboooom/mods/mm/model/ProcessUpdate.java deleted file mode 100644 index 65a77b2..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/model/ProcessUpdate.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.ticticboooom.mods.mm.model; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; -import net.minecraft.util.ResourceLocation; - -import java.util.List; - -@Getter -@Setter -@AllArgsConstructor -public class ProcessUpdate { - private int ticksTaken; - private String msg; - private String id; - private String sid; - private List takenIndices; -} diff --git a/src/main/java/com/ticticboooom/mods/mm/nbt/NBTActionParser.java b/src/main/java/com/ticticboooom/mods/mm/nbt/NBTActionParser.java deleted file mode 100644 index 508e4b9..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/nbt/NBTActionParser.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.ticticboooom.mods.mm.nbt; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.nbt.model.NBTActionModel; -import com.ticticboooom.mods.mm.nbt.model.NBTModel; -import net.minecraft.data.NBTToSNBTConverter; -import net.minecraft.nbt.JsonToNBT; -import net.minecraft.nbt.NBTUtil; -import net.minecraft.network.PacketBuffer; - -import java.util.ArrayList; -import java.util.List; - -public class NBTActionParser { - public static NBTModel parse(JsonArray section) { - List resultList = new ArrayList<>(); - for (JsonElement elem : section) { - JsonObject obj = elem.getAsJsonObject(); - NBTActionModel model = new NBTActionModel( - obj.get("action").getAsString(), - obj.get("key").getAsString(), - obj.get("value") - ); - resultList.add(model); - } - if (resultList.isEmpty()){ - return null; - } - return new NBTModel(resultList); - } - - public static NBTModel parse(PacketBuffer buf) { - int i = buf.readInt(); - List resultList = new ArrayList<>(); - for (int i1 = 0; i1 < i; i1++) { - resultList.add(new NBTActionModel(buf.readString(), buf.readString(), new JsonParser().parse(buf.readString()))); - } - if (i <= 0){ - return null; - } - return new NBTModel(resultList); - } - - public static void write(PacketBuffer buf, NBTModel model) { - if (model == null) { - buf.writeInt(0); - return; - } - buf.writeInt(model.getActions().size()); - for (NBTActionModel action : model.getActions()) { - buf.writeString(action.getAction()); - buf.writeString(action.getKey()); - buf.writeString(action.getValue().toString()); - } - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/nbt/NBTPopulate.java b/src/main/java/com/ticticboooom/mods/mm/nbt/NBTPopulate.java deleted file mode 100644 index 5a64bac..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/nbt/NBTPopulate.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.ticticboooom.mods.mm.nbt; - -import com.ticticboooom.mods.mm.nbt.model.NBTActionModel; -import com.ticticboooom.mods.mm.nbt.model.NBTModel; -import lombok.SneakyThrows; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.JsonToNBT; - -public class NBTPopulate { - public static CompoundNBT populate(CompoundNBT tag, NBTModel model) { - for (NBTActionModel action : model.getActions()) { - tag = innerPopulate(tag, action); - } - return tag; - } - - @SneakyThrows - private static CompoundNBT innerPopulate(CompoundNBT tag, NBTActionModel action) { - if (action.getAction().equals("set")){ - return NBTUtils.setValue(tag, action.getKey(), JsonToNBT.getTagFromJson(action.getValue().toString())); - } - return tag; - } - -} diff --git a/src/main/java/com/ticticboooom/mods/mm/nbt/NBTUtils.java b/src/main/java/com/ticticboooom/mods/mm/nbt/NBTUtils.java deleted file mode 100644 index 97ac15f..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/nbt/NBTUtils.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.ticticboooom.mods.mm.nbt; - -import net.minecraft.nbt.*; - -public class NBTUtils { - public static boolean containsKey(CompoundNBT tag, String key) { - if (key.contains(":")) { - int i = key.indexOf(":"); - if (i >= key.length() - 1) { - return false; - } - String remains = key.substring(i + 1, key.length() - 1); - String current = key.substring(0, i); - if (tag.contains(current)) { - return containsKey(tag, remains); - } else { - return false; - } - } - return tag.contains(key); - } - - public static INBT getValue(CompoundNBT tag, String key) { - if (key.contains(":")) { - int i = key.indexOf(":"); - if (i >= key.length() - 1) { - return null; - } - String remains = key.substring(i + 1, key.length() - 1); - String current = key.substring(0, i); - if (tag.contains(current)) { - return getValue(tag.getCompound(current), remains); - } else { - return null; - } - } - return tag.get(key); - } - - public static CompoundNBT setValue(CompoundNBT tag, String key, CompoundNBT value) { - if (key.contains(":")) { - int i = key.indexOf(":"); - if (i >= key.length() - 1) { - return null; - } - String remains = key.substring(i + 1, key.length() - 1); - String current = key.substring(0, i); - if (!tag.contains(current)) { - tag.put(current, new CompoundNBT()); - } - return setValue(tag.getCompound(current), remains, value); - } - tag.put(key, value); - return tag; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/nbt/NBTValidator.java b/src/main/java/com/ticticboooom/mods/mm/nbt/NBTValidator.java deleted file mode 100644 index 30ec961..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/nbt/NBTValidator.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.ticticboooom.mods.mm.nbt; - -import com.ticticboooom.mods.mm.nbt.model.NBTActionModel; -import com.ticticboooom.mods.mm.nbt.model.NBTModel; -import lombok.SneakyThrows; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.INBT; -import net.minecraft.nbt.JsonToNBT; -import net.minecraft.nbt.NBTUtil; - -public class NBTValidator { - public static boolean isValid(CompoundNBT tag, NBTModel requirements) { - for (NBTActionModel action : requirements.getActions()) { - if (!innerIsValid(tag, action)){ - return false; - } - } - return true; - } - - @SneakyThrows - private static boolean innerIsValid(CompoundNBT tag, NBTActionModel model) { - if (model.getAction().equals("contains_key")) { - return NBTUtils.containsKey(tag, model.getKey()); - } - if (model.getAction().equals("contains_val")) { - INBT value = NBTUtils.getValue(tag, model.getKey()); - CompoundNBT valueTag = JsonToNBT.getTagFromJson(model.getValue().toString()); - return NBTUtil.areNBTEquals(value, valueTag, false); - } - if (model.getAction().equals("exact_eq")){ - INBT value = NBTUtils.getValue(tag, model.getKey()); - CompoundNBT valueTag = JsonToNBT.getTagFromJson(model.getValue().toString()); - return NBTUtil.areNBTEquals(value, valueTag, true); - } - return false; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/nbt/model/NBTActionModel.java b/src/main/java/com/ticticboooom/mods/mm/nbt/model/NBTActionModel.java deleted file mode 100644 index 26f07fb..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/nbt/model/NBTActionModel.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.ticticboooom.mods.mm.nbt.model; - -import com.google.gson.JsonElement; -import com.google.gson.JsonPrimitive; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public class NBTActionModel { - private final String action; - private final String key; - private final JsonElement value; -} diff --git a/src/main/java/com/ticticboooom/mods/mm/nbt/model/NBTModel.java b/src/main/java/com/ticticboooom/mods/mm/nbt/model/NBTModel.java deleted file mode 100644 index 9d7d1cf..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/nbt/model/NBTModel.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.ticticboooom.mods.mm.nbt.model; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.List; - -@Getter -@AllArgsConstructor -public class NBTModel { - private final List actions; -} diff --git a/src/main/java/com/ticticboooom/mods/mm/network/PacketHandler.java b/src/main/java/com/ticticboooom/mods/mm/network/PacketHandler.java deleted file mode 100644 index 9ab45fa..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/network/PacketHandler.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.ticticboooom.mods.mm.network; - -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.network.packets.TileClientUpdatePacket; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.network.NetworkRegistry; -import net.minecraftforge.fml.network.simple.SimpleChannel; - -public class PacketHandler { - private static final String PROTOCOL_VERSION = "1"; - public static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel( - new ResourceLocation(MM.ID, "main"), - () -> PROTOCOL_VERSION, - PROTOCOL_VERSION::equals, - PROTOCOL_VERSION::equals - ); - - public static void init() { - int index = 0; - INSTANCE.registerMessage(index++, TileClientUpdatePacket.Data.class, TileClientUpdatePacket.Data::encode, TileClientUpdatePacket.Data::decode, TileClientUpdatePacket::handle); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/network/packets/TileClientUpdatePacket.java b/src/main/java/com/ticticboooom/mods/mm/network/packets/TileClientUpdatePacket.java deleted file mode 100644 index 9f942c0..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/network/packets/TileClientUpdatePacket.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.ticticboooom.mods.mm.network.packets; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import net.minecraft.block.BlockState; -import net.minecraft.client.Minecraft; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.network.PacketBuffer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraftforge.fml.network.NetworkEvent; - -import java.util.function.Supplier; - -public class TileClientUpdatePacket { - @AllArgsConstructor - @Getter - public static final class Data { - private final BlockPos pos; - private final CompoundNBT nbt; - - public static void encode(Data data, PacketBuffer buffer){ - buffer.writeBlockPos(data.getPos()); - buffer.writeCompoundTag(data.nbt); - } - - public static Data decode(PacketBuffer buffer){ - return new Data(buffer.readBlockPos(), buffer.readCompoundTag()); - } - } - - public static void handle(Data data, Supplier ctx) { - ctx.get().enqueueWork(() -> { - ClientWorld level = Minecraft.getInstance().world; - TileEntity blockEntity = level.getTileEntity(data.getPos()); - BlockState state = level.getBlockState(data.getPos()); - if (blockEntity != null) { - blockEntity.read(state, data.nbt); - } - }); - ctx.get().setPacketHandled(true); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/MasterfulPortType.java b/src/main/java/com/ticticboooom/mods/mm/ports/MasterfulPortType.java deleted file mode 100644 index 16e8710..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/MasterfulPortType.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.ticticboooom.mods.mm.ports; - -import com.ticticboooom.mods.mm.ports.parser.PortFactory; -import lombok.Getter; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.registries.IForgeRegistryEntry; - -import javax.annotation.Nullable; - -public class MasterfulPortType implements IForgeRegistryEntry { - - private ResourceLocation name; - @Getter - private PortFactory parser; - - public MasterfulPortType(ResourceLocation name, PortFactory parser) { - this.name = name; - this.parser = parser; - } - - @Override - public MasterfulPortType setRegistryName(ResourceLocation name) { - this.name = name; - return this; - } - - @Nullable - @Override - public ResourceLocation getRegistryName() { - return name; - } - - @Override - public Class getRegistryType() { - return (Class) getClass(); - } - - -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/parser/EnergyPortParser.java b/src/main/java/com/ticticboooom/mods/mm/ports/parser/EnergyPortParser.java deleted file mode 100644 index ba1feae..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/parser/EnergyPortParser.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.ticticboooom.mods.mm.ports.parser; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.DataResult; -import com.mojang.serialization.JsonOps; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.ports.state.EnergyPortState; -import com.ticticboooom.mods.mm.ports.state.PortState; -import com.ticticboooom.mods.mm.ports.storage.EnergyPortStorage; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import lombok.SneakyThrows; -import mezz.jei.api.ingredients.IIngredients; -import net.minecraft.block.Block; -import net.minecraft.inventory.container.ContainerType; -import net.minecraft.network.PacketBuffer; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.RegistryObject; - -import java.util.List; -import java.util.function.Supplier; - -public class EnergyPortParser extends PortFactory { - - @Override - public Supplier createStorage(JsonObject obj) { - return () -> { - DataResult> apply = JsonOps.INSTANCE.withDecoder(EnergyPortStorage.CODEC).apply(obj); - return apply.result().get().getFirst(); - }; - } - - @SneakyThrows - @Override - public void write(PacketBuffer buf, PortState state) { - buf.func_240629_a_(EnergyPortState.CODEC, ((EnergyPortState) state)); - } - - @Override - public void setIngredients(IIngredients ingredients, List stacks, boolean input) { - } - - @Override - public ResourceLocation getInputOverlay() { - return new ResourceLocation(MM.ID, "block/base_ports/energy_input_cutout"); - } - - @Override - public ResourceLocation getOutputOverlay() { - return new ResourceLocation(MM.ID, "block/base_ports/energy_output_cutout"); - } - - - @Override - public PortState createState(JsonObject obj) { - DataResult> apply = JsonOps.INSTANCE.withDecoder(EnergyPortState.CODEC).apply(obj); - return apply.result().get().getFirst(); - } - - @Override - @SneakyThrows - public PortState createState(PacketBuffer buf) { - return buf.func_240628_a_(EnergyPortState.CODEC); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/parser/FluidPortParser.java b/src/main/java/com/ticticboooom/mods/mm/ports/parser/FluidPortParser.java deleted file mode 100644 index 1a414de..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/parser/FluidPortParser.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.ticticboooom.mods.mm.ports.parser; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.DataResult; -import com.mojang.serialization.JsonOps; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.ports.state.FluidPortState; -import com.ticticboooom.mods.mm.ports.state.PortState; -import com.ticticboooom.mods.mm.ports.storage.FluidPortStorage; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import lombok.SneakyThrows; -import mezz.jei.api.constants.VanillaTypes; -import mezz.jei.api.ingredients.IIngredients; -import net.minecraft.network.PacketBuffer; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fluids.FluidStack; - -import java.util.List; -import java.util.function.Supplier; - -public class FluidPortParser extends PortFactory { - - @Override - public Supplier createStorage(JsonObject obj) { - return () -> { - DataResult> apply = JsonOps.INSTANCE.withDecoder(FluidPortStorage.CODEC).apply(obj); - return apply.result().get().getFirst(); - }; - } - @SneakyThrows - @Override - public void write(PacketBuffer buf, PortState state) { - buf.func_240629_a_(FluidPortState.CODEC, ((FluidPortState) state)); - } - - @Override - public void setIngredients(IIngredients ingredients, List stacks, boolean input) { - if (input) { - ingredients.setInputs(VanillaTypes.FLUID, (List)stacks); - } else { - ingredients.setOutputs(VanillaTypes.FLUID, (List)stacks); - } - } - - @Override - public PortState createState(JsonObject obj) { - DataResult> apply = JsonOps.INSTANCE.withDecoder(FluidPortState.CODEC).apply(obj); - return apply.result().get().getFirst(); - } - - @Override - @SneakyThrows - public PortState createState(PacketBuffer buf) { - return buf.func_240628_a_(FluidPortState.CODEC); - } - - @Override - public ResourceLocation getInputOverlay() { - return new ResourceLocation(MM.ID, "block/base_ports/fluid_input_cutout"); - } - - @Override - public ResourceLocation getOutputOverlay() { - return new ResourceLocation(MM.ID, "block/base_ports/fluid_output_cutout"); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/parser/ItemPortParser.java b/src/main/java/com/ticticboooom/mods/mm/ports/parser/ItemPortParser.java deleted file mode 100644 index c52ab81..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/parser/ItemPortParser.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.ticticboooom.mods.mm.ports.parser; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.DataResult; -import com.mojang.serialization.JsonOps; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.nbt.NBTActionParser; -import com.ticticboooom.mods.mm.nbt.model.NBTModel; -import com.ticticboooom.mods.mm.ports.state.PortState; -import com.ticticboooom.mods.mm.ports.state.ItemPortState; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import com.ticticboooom.mods.mm.ports.storage.ItemPortStorage; -import lombok.SneakyThrows; -import mezz.jei.api.constants.VanillaTypes; -import mezz.jei.api.ingredients.IIngredients; -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketBuffer; -import net.minecraft.util.ResourceLocation; - -import java.util.List; -import java.util.function.Supplier; - -public class ItemPortParser extends PortFactory { - - - @Override - public void setIngredients(IIngredients ingredients, List stacks, boolean input) { - if (input) { - ingredients.setInputs(VanillaTypes.ITEM, (List)stacks); - } else { - ingredients.setOutputs(VanillaTypes.ITEM, (List)stacks); - } - } - - @Override - public Supplier createStorage(JsonObject obj) { - return () -> { - DataResult> apply = JsonOps.INSTANCE.withDecoder(ItemPortStorage.CODEC).apply(obj); - return apply.result().get().getFirst(); - }; - } - - @SneakyThrows - @Override - public void write(PacketBuffer buf, PortState state) { - buf.func_240629_a_(ItemPortState.CODEC, ((ItemPortState) state)); - NBTActionParser.write(buf, ((ItemPortState) state).getNbt()); - } - - @Override - public PortState createState(JsonObject obj) { - DataResult> apply = JsonOps.INSTANCE.withDecoder(ItemPortState.CODEC).apply(obj); - ItemPortState result = apply.result().get().getFirst(); - if (obj.has("nbt")){ - JsonElement nbt = obj.get("nbt"); - NBTModel parse = NBTActionParser.parse(nbt.getAsJsonArray()); - result.setNbt(parse); - } - return result; - - } - - @SneakyThrows - @Override - public PortState createState(PacketBuffer buf) { - ItemPortState state = buf.func_240628_a_(ItemPortState.CODEC); - NBTModel parsed = NBTActionParser.parse(buf); - state.setNbt(parsed); - return state; - - } - @Override - public ResourceLocation getInputOverlay() { - return new ResourceLocation(MM.ID, "block/base_ports/item_input_cutout"); - } - - @Override - public ResourceLocation getOutputOverlay() { - return new ResourceLocation(MM.ID, "block/base_ports/item_output_cutout"); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/parser/ManaPortParser.java b/src/main/java/com/ticticboooom/mods/mm/ports/parser/ManaPortParser.java deleted file mode 100644 index 2424641..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/parser/ManaPortParser.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.ticticboooom.mods.mm.ports.parser; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.DataResult; -import com.mojang.serialization.JsonOps; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.MachinePortBlock; -import com.ticticboooom.mods.mm.block.tile.ManaMachinePortBlockEntity; -import com.ticticboooom.mods.mm.ports.state.ManaPortState; -import com.ticticboooom.mods.mm.ports.state.PortState; -import com.ticticboooom.mods.mm.ports.storage.ManaPortStorage; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import com.ticticboooom.mods.mm.registration.MMSetup; -import com.ticticboooom.mods.mm.registration.Registerable; -import lombok.SneakyThrows; -import mezz.jei.api.ingredients.IIngredients; -import net.minecraft.inventory.container.ContainerType; -import net.minecraft.network.PacketBuffer; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.RegistryObject; -import net.minecraftforge.registries.DeferredRegister; - -import java.util.List; -import java.util.function.Supplier; - -public class ManaPortParser extends PortFactory { - - @Override - public Supplier createStorage(JsonObject obj) { - return () -> { - DataResult> apply = JsonOps.INSTANCE.withDecoder(ManaPortStorage.CODEC).apply(obj); - return apply.result().get().getFirst(); - }; - } - - @SneakyThrows - @Override - public void write(PacketBuffer buf, PortState state) { - buf.func_240629_a_(ManaPortState.CODEC, ((ManaPortState) state)); - } - - @Override - public void setIngredients(IIngredients ingredients, List stacks, boolean input) { - } - - @Override - public ResourceLocation getInputOverlay() { - return new ResourceLocation(MM.ID, "block/compat_ports/botania_mana_input_cutout"); - } - - @Override - public ResourceLocation getOutputOverlay() { - return new ResourceLocation(MM.ID, "block/compat_ports/botania_mana_output_cutout"); - } - - @Override - public PortState createState(JsonObject obj) { - DataResult> apply = JsonOps.INSTANCE.withDecoder(ManaPortState.CODEC).apply(obj); - return apply.result().get().getFirst(); - } - - @Override - @SneakyThrows - public PortState createState(PacketBuffer buf) { - return buf.func_240628_a_(ManaPortState.CODEC); - } - - @Override - public RegistryObject> registerTileEntity(String id, DeferredRegister> reg, Registerable>>tile, Registerable> block, Registerable>> containerType, Supplier portStorage, boolean isInput){ - return reg.register(id, () -> TileEntityType.Builder.create(() -> new ManaMachinePortBlockEntity(tile.get().get(), containerType.get().get(), portStorage.get(), isInput), block.get().get()).build(null)); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/parser/MekGasPortParser.java b/src/main/java/com/ticticboooom/mods/mm/ports/parser/MekGasPortParser.java deleted file mode 100644 index e881c04..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/parser/MekGasPortParser.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.ticticboooom.mods.mm.ports.parser; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.DataResult; -import com.mojang.serialization.JsonOps; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.ports.state.PortState; -import com.ticticboooom.mods.mm.ports.state.MekGasPortState; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import com.ticticboooom.mods.mm.ports.storage.MekGasPortStorage; -import lombok.SneakyThrows; -import mekanism.api.chemical.gas.GasStack; -import mekanism.client.jei.MekanismJEI; -import mezz.jei.api.ingredients.IIngredients; -import net.minecraft.network.PacketBuffer; -import net.minecraft.util.ResourceLocation; - -import java.util.List; -import java.util.function.Supplier; - -public class MekGasPortParser extends PortFactory { - - @Override - public void setIngredients(IIngredients ingredients, List stacks, boolean input) { - if (input) { - ingredients.setInputs(MekanismJEI.TYPE_GAS, (List)stacks); - } else { - ingredients.setOutputs(MekanismJEI.TYPE_GAS, (List)stacks); - } - } - - @Override - public PortState createState(JsonObject obj) { - DataResult> apply = JsonOps.INSTANCE.withDecoder(MekGasPortState.CODEC).apply(obj); - return apply.result().get().getFirst(); - } - - @SneakyThrows - @Override - public PortState createState(PacketBuffer buf) { - return buf.func_240628_a_(MekGasPortState.CODEC); - } - - @Override - public Supplier createStorage(JsonObject obj) { - return () -> { - DataResult> apply = JsonOps.INSTANCE.withDecoder(MekGasPortStorage.CODEC).apply(obj); - return apply.result().get().getFirst(); - }; - } - - @SneakyThrows - @Override - public void write(PacketBuffer buf, PortState state) { - buf.func_240629_a_(MekGasPortState.CODEC, (MekGasPortState)state); - } - - @Override - public ResourceLocation getInputOverlay() { - return new ResourceLocation(MM.ID, "block/compat_ports/mekanism_gas_input_cutout"); - } - - @Override - public ResourceLocation getOutputOverlay() { - return new ResourceLocation(MM.ID, "block/compat_ports/mekanism_gas_output_cutout"); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/parser/MekInfusePortParser.java b/src/main/java/com/ticticboooom/mods/mm/ports/parser/MekInfusePortParser.java deleted file mode 100644 index 4f7a226..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/parser/MekInfusePortParser.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.ticticboooom.mods.mm.ports.parser; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.DataResult; -import com.mojang.serialization.JsonOps; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.ports.state.MekInfusePortState; -import com.ticticboooom.mods.mm.ports.state.MekSlurryPortState; -import com.ticticboooom.mods.mm.ports.state.PortState; -import com.ticticboooom.mods.mm.ports.storage.MekInfusePortStorage; -import com.ticticboooom.mods.mm.ports.storage.MekSlurryPortStorage; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import lombok.SneakyThrows; -import mekanism.api.chemical.infuse.InfusionStack; -import mekanism.api.chemical.slurry.SlurryStack; -import mekanism.client.jei.MekanismJEI; -import mezz.jei.api.ingredients.IIngredients; -import net.minecraft.network.PacketBuffer; -import net.minecraft.util.ResourceLocation; - -import java.util.List; -import java.util.function.Supplier; - -public class MekInfusePortParser extends PortFactory { - - @Override - public void setIngredients(IIngredients ingredients, List stacks, boolean input) { - if (input) { - ingredients.setInputs(MekanismJEI.TYPE_INFUSION, (List)stacks); - } else { - ingredients.setOutputs(MekanismJEI.TYPE_INFUSION, (List)stacks); - } - } - - @Override - public PortState createState(JsonObject obj) { - DataResult> apply = JsonOps.INSTANCE.withDecoder(MekInfusePortState.CODEC).apply(obj); - return apply.result().get().getFirst(); - } - - @SneakyThrows - @Override - public PortState createState(PacketBuffer buf) { - return buf.func_240628_a_(MekInfusePortState.CODEC); - } - - @Override - public Supplier createStorage(JsonObject obj) { - return () -> { - DataResult> apply = JsonOps.INSTANCE.withDecoder(MekInfusePortStorage.CODEC).apply(obj); - return apply.result().get().getFirst(); - }; - } - - @SneakyThrows - @Override - public void write(PacketBuffer buf, PortState state) { - buf.func_240629_a_(MekInfusePortState.CODEC, (MekInfusePortState)state); - } - - @Override - public ResourceLocation getInputOverlay() { - return new ResourceLocation(MM.ID, "block/compat_ports/mekanism_infusion_input_cutout"); - } - - @Override - public ResourceLocation getOutputOverlay() { - return new ResourceLocation(MM.ID, "block/compat_ports/mekanism_infusion_output_cutout"); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/parser/MekSlurryPortParser.java b/src/main/java/com/ticticboooom/mods/mm/ports/parser/MekSlurryPortParser.java deleted file mode 100644 index 4ebe50a..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/parser/MekSlurryPortParser.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.ticticboooom.mods.mm.ports.parser; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.DataResult; -import com.mojang.serialization.JsonOps; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.ports.state.PortState; -import com.ticticboooom.mods.mm.ports.state.MekSlurryPortState; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import com.ticticboooom.mods.mm.ports.storage.MekSlurryPortStorage; -import lombok.SneakyThrows; -import mekanism.api.chemical.slurry.SlurryStack; -import mekanism.client.jei.MekanismJEI; -import mezz.jei.api.ingredients.IIngredients; -import net.minecraft.network.PacketBuffer; -import net.minecraft.util.ResourceLocation; - -import java.util.List; -import java.util.function.Supplier; - -public class MekSlurryPortParser extends PortFactory { - - @Override - public void setIngredients(IIngredients ingredients, List stacks, boolean input) { - if (input) { - ingredients.setInputs(MekanismJEI.TYPE_SLURRY, (List)stacks); - } else { - ingredients.setOutputs(MekanismJEI.TYPE_SLURRY, (List)stacks); - } - } - - @Override - public PortState createState(JsonObject obj) { - DataResult> apply = JsonOps.INSTANCE.withDecoder(MekSlurryPortState.CODEC).apply(obj); - return apply.result().get().getFirst(); - } - - @SneakyThrows - @Override - public PortState createState(PacketBuffer buf) { - return buf.func_240628_a_(MekSlurryPortState.CODEC); - } - - @Override - public Supplier createStorage(JsonObject obj) { - return () -> { - DataResult> apply = JsonOps.INSTANCE.withDecoder(MekSlurryPortStorage.CODEC).apply(obj); - return apply.result().get().getFirst(); - }; - } - - @SneakyThrows - @Override - public void write(PacketBuffer buf, PortState state) { - buf.func_240629_a_(MekSlurryPortState.CODEC, (MekSlurryPortState)state); - } - - @Override - public ResourceLocation getInputOverlay() { - return new ResourceLocation(MM.ID, "block/compat_ports/mekanism_slurry_input_cutout"); - } - - @Override - public ResourceLocation getOutputOverlay() { - return new ResourceLocation(MM.ID, "block/compat_ports/mekanism_slurry_output_cutout"); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/parser/PneumaticPortParser.java b/src/main/java/com/ticticboooom/mods/mm/ports/parser/PneumaticPortParser.java deleted file mode 100644 index 0ccad4f..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/parser/PneumaticPortParser.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.ticticboooom.mods.mm.ports.parser; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.DataResult; -import com.mojang.serialization.JsonOps; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.client.jei.MMJeiPlugin; -import com.ticticboooom.mods.mm.client.jei.ingredients.model.PressureStack; -import com.ticticboooom.mods.mm.ports.state.PneumaticPortState; -import com.ticticboooom.mods.mm.ports.state.PortState; -import com.ticticboooom.mods.mm.ports.storage.PneumaticPortStorage; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import lombok.SneakyThrows; -import mezz.jei.api.ingredients.IIngredients; -import net.minecraft.network.PacketBuffer; -import net.minecraft.util.ResourceLocation; - -import java.util.List; -import java.util.function.Supplier; - -public class PneumaticPortParser extends PortFactory { - - @Override - public Supplier createStorage(JsonObject obj) { - return () -> { - DataResult> apply = JsonOps.INSTANCE.withDecoder(PneumaticPortStorage.CODEC).apply(obj); - return apply.result().get().getFirst(); - }; - } - @SneakyThrows - @Override - public void write(PacketBuffer buf, PortState state) { - buf.func_240629_a_(PneumaticPortState.CODEC, ((PneumaticPortState) state)); - } - - @Override - public void setIngredients(IIngredients ingredients, List stacks, boolean input) { - if (input) { - ingredients.setInputs(MMJeiPlugin.PRESSURE_TYPE, (List)stacks); - } else { - ingredients.setOutputs(MMJeiPlugin.PRESSURE_TYPE, (List)stacks); - } - } - - @Override - public ResourceLocation getInputOverlay() { - return new ResourceLocation(MM.ID, "block/compat_ports/pncr_pressure_input_cutout"); - } - - @Override - public ResourceLocation getOutputOverlay() { - return new ResourceLocation(MM.ID, "block/compat_ports/pncr_pressure_output_cutout"); - } - - @Override - public PortState createState(JsonObject obj) { - DataResult> apply = JsonOps.INSTANCE.withDecoder(PneumaticPortState.CODEC).apply(obj); - return apply.result().get().getFirst(); - } - - @Override - @SneakyThrows - public PortState createState(PacketBuffer buf) { - return buf.func_240628_a_(PneumaticPortState.CODEC); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/parser/PortFactory.java b/src/main/java/com/ticticboooom/mods/mm/ports/parser/PortFactory.java deleted file mode 100644 index b11ccb7..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/parser/PortFactory.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.ticticboooom.mods.mm.ports.parser; - -import com.google.gson.JsonObject; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.MachinePortBlock; -import com.ticticboooom.mods.mm.block.tile.MachinePortBlockEntity; -import com.ticticboooom.mods.mm.datagen.gen.runtime.MMBlockStateProvider; -import com.ticticboooom.mods.mm.helper.RLUtils; -import com.ticticboooom.mods.mm.model.ModelOverrideModel; -import com.ticticboooom.mods.mm.ports.state.PortState; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import com.ticticboooom.mods.mm.registration.MMSetup; -import com.ticticboooom.mods.mm.registration.Registerable; -import mezz.jei.api.ingredients.IIngredients; -import net.minecraft.block.Block; -import net.minecraft.inventory.container.ContainerType; -import net.minecraft.network.PacketBuffer; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.model.generators.BlockStateProvider; -import net.minecraftforge.client.model.generators.ModelFile; -import net.minecraftforge.fml.RegistryObject; -import net.minecraftforge.registries.DeferredRegister; - -import java.util.List; -import java.util.function.Supplier; - -public abstract class PortFactory { - public abstract PortState createState(JsonObject obj); - - public abstract PortState createState(PacketBuffer buf); - - public abstract Supplier createStorage(JsonObject obj); - - public abstract void write(PacketBuffer buf, PortState state); - - public abstract void setIngredients(IIngredients ingredients, List stacks, boolean input); - - public abstract ResourceLocation getInputOverlay(); - - public abstract ResourceLocation getOutputOverlay(); - - public RegistryObject> registerTileEntity(String id, DeferredRegister> reg, Registerable>> tile, Registerable> block, Registerable>> containerType, Supplier portStorage, boolean isInput) { - return reg.register(id, () -> TileEntityType.Builder.create(() -> new MachinePortBlockEntity(tile.get().get(), containerType.get().get(), portStorage.get(), isInput), block.get().get()).build(null)); - } - - public RegistryObject registerBlock(String id, DeferredRegister reg, Registerable>> type, String name, String controllerId, String textureOverride, ResourceLocation overlay, ResourceLocation portTypeId) { - return reg.register(id, () -> new MachinePortBlock(type.get(), name, controllerId, textureOverride, overlay, portTypeId)); - } - - - public void generateBlockStates(MMBlockStateProvider provider, boolean input, RegistryObject port) { - if (input) { - provider.dynamicBlock(port.getId(), port.get().getTextureOverride() != null ? RLUtils.toRL(port.get().getTextureOverride()) : MMBlockStateProvider.BASE_TEXTURE, port.get().getOverlay()); - provider.simpleBlock(port.get(), new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + port.getId().getPath()))); - } else { - provider.dynamicBlock(port.getId(), port.get().getTextureOverride() != null ? RLUtils.toRL(port.get().getTextureOverride()) : MMBlockStateProvider.BASE_TEXTURE, port.get().getOverlay()); - provider.simpleBlock(port.get(), new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + port.getId().getPath()))); - } - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/parser/RotationPortParser.java b/src/main/java/com/ticticboooom/mods/mm/ports/parser/RotationPortParser.java deleted file mode 100644 index 5bb37c6..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/parser/RotationPortParser.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.ticticboooom.mods.mm.ports.parser; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.DataResult; -import com.mojang.serialization.JsonOps; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.MachinePortBlock; -import com.ticticboooom.mods.mm.block.RotationMachinePortBlock; -import com.ticticboooom.mods.mm.block.tile.RotationGenMachinePortBlockEntity; -import com.ticticboooom.mods.mm.block.tile.RotationMachinePortBlockEntity; -import com.ticticboooom.mods.mm.ports.state.PortState; -import com.ticticboooom.mods.mm.ports.state.RotationPortState; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import com.ticticboooom.mods.mm.ports.storage.RotationPortStorage; -import com.ticticboooom.mods.mm.registration.Registerable; -import lombok.SneakyThrows; -import mezz.jei.api.ingredients.IIngredients; -import net.minecraft.block.Block; -import net.minecraft.inventory.container.ContainerType; -import net.minecraft.network.PacketBuffer; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.RegistryObject; -import net.minecraftforge.registries.DeferredRegister; - -import java.util.List; -import java.util.function.Supplier; - -public class RotationPortParser extends PortFactory { - - @Override - public Supplier createStorage(JsonObject obj) { - return () -> { - DataResult> apply = JsonOps.INSTANCE.withDecoder(RotationPortStorage.CODEC).apply(obj); - return apply.result().get().getFirst(); - }; - } - - @SneakyThrows - @Override - public void write(PacketBuffer buf, PortState state) { - buf.func_240629_a_(RotationPortState.CODEC, ((RotationPortState) state)); - } - - @Override - public void setIngredients(IIngredients ingredients, List stacks, boolean input) { - } - - @Override - public ResourceLocation getInputOverlay() { - return new ResourceLocation(MM.ID, "block/compat_ports/create_rotation_input_cutout"); - } - - @Override - public ResourceLocation getOutputOverlay() { - return new ResourceLocation(MM.ID, "block/compat_ports/create_rotation_output_cutout"); - } - - @Override - public PortState createState(JsonObject obj) { - DataResult> apply = JsonOps.INSTANCE.withDecoder(RotationPortState.CODEC).apply(obj); - return apply.result().get().getFirst(); - } - - @Override - @SneakyThrows - public PortState createState(PacketBuffer buf) { - return buf.func_240628_a_(RotationPortState.CODEC); - } - - @Override - public RegistryObject> registerTileEntity(String id, DeferredRegister> reg, Registerable>> tile, Registerable> block, Registerable>> containerType, Supplier portStorage, boolean isInput) { - if (isInput) { - return reg.register(id, () -> TileEntityType.Builder.create(() -> new RotationMachinePortBlockEntity(tile.get().get(), containerType.get().get(), portStorage.get(), isInput), block.get().get()).build(null)); - } else { - return reg.register(id, () -> TileEntityType.Builder.create(() -> new RotationGenMachinePortBlockEntity(tile.get().get(), containerType.get().get(), portStorage.get(), isInput), block.get().get()).build(null)); - } - } - - @Override - public RegistryObject registerBlock(String id, DeferredRegister reg, Registerable>> type, String name, String controllerId, String textureOverride, ResourceLocation overlay, ResourceLocation portTypeId) { - return reg.register(id, () -> new RotationMachinePortBlock(type.get(), name, controllerId, textureOverride, overlay, portTypeId)); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/parser/StarlightPortParser.java b/src/main/java/com/ticticboooom/mods/mm/ports/parser/StarlightPortParser.java deleted file mode 100644 index f7e5d03..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/parser/StarlightPortParser.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.ticticboooom.mods.mm.ports.parser; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.DataResult; -import com.mojang.serialization.JsonOps; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.MachinePortBlock; -import com.ticticboooom.mods.mm.block.tile.AstralMachineInputPortBlockEntity; -import com.ticticboooom.mods.mm.block.tile.AstralMachinePortBlockEntity; -import com.ticticboooom.mods.mm.ports.state.PortState; -import com.ticticboooom.mods.mm.ports.state.StarlightPortState; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import com.ticticboooom.mods.mm.ports.storage.StarlightPortStorage; -import com.ticticboooom.mods.mm.registration.Registerable; -import lombok.SneakyThrows; -import mezz.jei.api.ingredients.IIngredients; -import net.minecraft.inventory.container.ContainerType; -import net.minecraft.network.PacketBuffer; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.RegistryObject; -import net.minecraftforge.registries.DeferredRegister; - -import java.util.List; -import java.util.function.Supplier; - -public class StarlightPortParser extends PortFactory { - - @Override - public Supplier createStorage(JsonObject obj) { - return () -> { - DataResult> apply = JsonOps.INSTANCE.withDecoder(StarlightPortStorage.CODEC).apply(obj); - return apply.result().get().getFirst(); - }; - } - @SneakyThrows - @Override - public void write(PacketBuffer buf, PortState state) { - buf.func_240629_a_(StarlightPortState.CODEC, ((StarlightPortState) state)); - } - - @Override - public void setIngredients(IIngredients ingredients, List stacks, boolean input) { - } - - @Override - public ResourceLocation getInputOverlay() { - return new ResourceLocation(MM.ID, "block/compat_ports/astral_starlight_input_cutout"); - } - - @Override - public ResourceLocation getOutputOverlay() { - return new ResourceLocation(MM.ID, "block/compat_ports/astral_starlight_output_cutout"); - } - - @Override - public PortState createState(JsonObject obj) { - DataResult> apply = JsonOps.INSTANCE.withDecoder(StarlightPortState.CODEC).apply(obj); - return apply.result().get().getFirst(); - } - - @Override - @SneakyThrows - public PortState createState(PacketBuffer buf) { - return buf.func_240628_a_(StarlightPortState.CODEC); - } - - @Override - public RegistryObject> registerTileEntity(String id, DeferredRegister> reg, Registerable>> tile, Registerable> block, Registerable>> containerType, Supplier portStorage, boolean isInput) { - if (isInput){ - return reg.register(id, () -> TileEntityType.Builder.create(() -> new AstralMachineInputPortBlockEntity(tile.get().get(), containerType.get().get(), portStorage.get()), block.get().get()).build(null)); - } else { - return reg.register(id, () -> TileEntityType.Builder.create(() -> new AstralMachinePortBlockEntity(tile.get().get(), containerType.get().get(), portStorage.get()), block.get().get()).build(null)); - } - - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/parser/WeatherPortParser.java b/src/main/java/com/ticticboooom/mods/mm/ports/parser/WeatherPortParser.java deleted file mode 100644 index 2ff393f..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/parser/WeatherPortParser.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.ticticboooom.mods.mm.ports.parser; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.DataResult; -import com.mojang.serialization.JsonOps; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.MachinePortBlock; -import com.ticticboooom.mods.mm.ports.state.PortState; -import com.ticticboooom.mods.mm.ports.state.StarlightPortState; -import com.ticticboooom.mods.mm.ports.state.WeatherPortState; -import com.ticticboooom.mods.mm.ports.storage.EnergyPortStorage; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import com.ticticboooom.mods.mm.ports.storage.WeatherPortStorage; -import com.ticticboooom.mods.mm.registration.Registerable; -import lombok.SneakyThrows; -import mezz.jei.api.ingredients.IIngredients; -import net.minecraft.block.Block; -import net.minecraft.inventory.container.ContainerType; -import net.minecraft.network.PacketBuffer; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.RegistryObject; -import net.minecraftforge.registries.DeferredRegister; - -import java.util.List; -import java.util.function.Supplier; - -public class WeatherPortParser extends PortFactory { - @Override - public PortState createState(JsonObject obj) { - DataResult> apply = JsonOps.INSTANCE.withDecoder(WeatherPortState.CODEC).apply(obj); - return apply.result().get().getFirst(); - } - - @SneakyThrows - @Override - public PortState createState(PacketBuffer buf) { - return buf.func_240628_a_(StarlightPortState.CODEC); - } - - @Override - public Supplier createStorage(JsonObject obj) { - return WeatherPortStorage::new; - } - - @SneakyThrows - @Override - public void write(PacketBuffer buf, PortState state) { - buf.func_240629_a_(WeatherPortState.CODEC, ((WeatherPortState) state)); - } - - @Override - public void setIngredients(IIngredients ingredients, List stacks, boolean input) { - - } - - @Override - public ResourceLocation getInputOverlay() { - return new ResourceLocation(MM.ID, "block/compat_ports/astral_starlight_input_cutout"); - } - - @Override - public ResourceLocation getOutputOverlay() { - return new ResourceLocation(MM.ID, "block/compat_ports/astral_starlight_output_cutout"); - } - - - @Override - public RegistryObject registerBlock(String id, DeferredRegister reg, Registerable>> type, String name, String controllerId, String textureOverride, ResourceLocation overlay, ResourceLocation portTypeId) { - return super.registerBlock(id, reg, type, name, controllerId, textureOverride, overlay, portTypeId); - } - - @Override - public RegistryObject> registerTileEntity(String id, DeferredRegister> reg, Registerable>> tile, Registerable> block, Registerable>> containerType, Supplier portStorage, boolean isInput) { - return super.registerTileEntity(id, reg, tile, block, containerType, portStorage, isInput); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/state/EnergyPortState.java b/src/main/java/com/ticticboooom/mods/mm/ports/state/EnergyPortState.java deleted file mode 100644 index a0ad26a..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/state/EnergyPortState.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.ticticboooom.mods.mm.ports.state; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.client.jei.MMJeiPlugin; -import com.ticticboooom.mods.mm.client.jei.ingredients.model.EnergyStack; -import com.ticticboooom.mods.mm.ports.storage.EnergyPortStorage; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import lombok.Getter; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.gui.drawable.IDrawableStatic; -import mezz.jei.api.gui.ingredient.IGuiIngredientGroup; -import mezz.jei.api.helpers.IJeiHelpers; -import mezz.jei.api.ingredients.IIngredientType; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.StringTextComponent; - -import java.util.List; - -public class EnergyPortState extends PortState { - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.INT.fieldOf("amount").forGetter(z -> z.amount) - ).apply(x, EnergyPortState::new)); - - - @Getter - private final int amount; - - public EnergyPortState(int amount) { - this.amount = amount; - - } - - @Override - public void processRequirement(List storage) { - int current = amount; - for (PortStorage inv : storage) { - if (inv instanceof EnergyPortStorage) { - EnergyPortStorage energyInv = (EnergyPortStorage) inv; - current -= energyInv.getInv().extractEnergy(current, false); - if (current <= 0) { - return; - } - } - } - } - - @Override - public boolean validateRequirement(List storage) { - int current = amount; - for (PortStorage inv : storage) { - if (inv instanceof EnergyPortStorage) { - EnergyPortStorage energyInv = (EnergyPortStorage) inv; - current -= energyInv.getInv().extractEnergy(current, true); - if (current <= 0) { - return true; - } - } - } - return false; - } - - @Override - public void processResult(List storage) { - int current = amount; - for (PortStorage inv : storage) { - if (inv instanceof EnergyPortStorage) { - EnergyPortStorage energyInv = (EnergyPortStorage) inv; - current -= energyInv.getInv().receiveEnergy(current, false); - if (current <= 0) { - return; - } - } - } - } - - @Override - public boolean validateResult(List storage) { - int current = amount; - for (PortStorage inv : storage) { - if (inv instanceof EnergyPortStorage) { - EnergyPortStorage energyInv = (EnergyPortStorage) inv; - current -= energyInv.getInv().receiveEnergy(current, true); - if (current <= 0) { - return true; - } - } - } - return false; - } - - @Override - public ResourceLocation getName() { - return new ResourceLocation(MM.ID, "energy"); - } - - @Override - public void render(MatrixStack ms, int x, int y, int mouseX, int mouseY, IJeiHelpers helpers) { - IDrawableStatic drawable = helpers.getGuiHelper().createDrawable(new ResourceLocation(MM.ID, "textures/gui/slot_parts.png"), 18, 61, 18, 18); - drawable.draw(ms, x, y); - } - - @Override - public void setupRecipe(IRecipeLayout layout, Integer typeIndex, int x, int y, boolean input) { - IGuiIngredientGroup group = layout.getIngredientsGroup(MMJeiPlugin.ENERGY_TYPE); - group.init(typeIndex, input, x + 1, y + 1); - group.set(typeIndex, new EnergyStack(amount)); - if (this.getChance() < 1){ - group.addTooltipCallback((s, a, b, c) -> { - if (s == typeIndex) { - c.add(new StringTextComponent("Chance: " + this.getChance() * 100 + "%")); - } - }); - } - } - - @Override - public IIngredientType getJeiIngredientType() { - return MMJeiPlugin.ENERGY_TYPE; - } -} \ No newline at end of file diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/state/FluidPortState.java b/src/main/java/com/ticticboooom/mods/mm/ports/state/FluidPortState.java deleted file mode 100644 index 5681bb5..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/state/FluidPortState.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.ticticboooom.mods.mm.ports.state; - -import com.google.common.collect.ImmutableList; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.exception.InvalidProcessDefinitionException; -import com.ticticboooom.mods.mm.helper.RLUtils; -import com.ticticboooom.mods.mm.ports.storage.FluidPortStorage; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import lombok.Getter; -import lombok.SneakyThrows; -import mezz.jei.api.constants.VanillaTypes; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.gui.drawable.IDrawableStatic; -import mezz.jei.api.helpers.IJeiHelpers; -import mezz.jei.api.ingredients.IIngredientType; -import mezz.jei.api.ingredients.IIngredients; -import net.minecraft.fluid.Fluid; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.StringTextComponent; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.registries.ForgeRegistries; - -import java.util.List; - -public class FluidPortState extends PortState { - - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.INT.fieldOf("amount").forGetter(z -> z.amount), - Codec.STRING.fieldOf("fluid").forGetter(z -> z.fluid) - ).apply(x, FluidPortState::new)); - - - @Getter - private final int amount; - @Getter - private final String fluid; - - public FluidPortState(int amount, String fluid) { - this.amount = amount; - this.fluid = fluid; - } - - @Override - public void processRequirement(List storage) { - int current = amount; - for (PortStorage inv : storage) { - if (inv instanceof FluidPortStorage) { - FluidPortStorage fInv = (FluidPortStorage) inv; - FluidStack fluidInTank = fInv.getInv().getFluidInTank(0); - if (!fluidInTank.getFluid().getRegistryName().toString().equals(fluid)) { - continue; - } - - current -= fInv.getInv().drain(new FluidStack(fluidInTank.getFluid(), current), IFluidHandler.FluidAction.EXECUTE).getAmount(); - if (current <= 0) { - return; - } - } - } - } - - @Override - public boolean validateRequirement(List storage) { - int current = amount; - for (PortStorage inv : storage) { - if (inv instanceof FluidPortStorage) { - FluidPortStorage fInv = (FluidPortStorage) inv; - FluidStack fluidInTank = fInv.getInv().getFluidInTank(0); - if (!fluidInTank.getFluid().getRegistryName().toString().equals(fluid)) { - continue; - } - - current -= fInv.getInv().drain(new FluidStack(fluidInTank.getFluid(), current), IFluidHandler.FluidAction.SIMULATE).getAmount(); - if (current <= 0) { - return true; - } - } - } - return false; - } - - @Override - public void processResult(List storage) { - int current = amount; - for (PortStorage inv : storage) { - if (inv instanceof FluidPortStorage) { - FluidPortStorage fInv = (FluidPortStorage) inv; - FluidStack fluidInTank = fInv.getInv().getFluidInTank(0); - if (!fluidInTank.isEmpty() && !fluidInTank.getFluid().getRegistryName().toString().equals(fluid)) { - continue; - } - - current -= fInv.getInv().fill(new FluidStack(ForgeRegistries.FLUIDS.getValue(RLUtils.toRL(fluid)), current), IFluidHandler.FluidAction.EXECUTE); - if (current <= 0) { - return; - } - } - } - } - - @Override - public boolean validateResult(List storage) { - int current = amount; - for (PortStorage inv : storage) { - if (inv instanceof FluidPortStorage) { - FluidPortStorage fInv = (FluidPortStorage) inv; - FluidStack fluidInTank = fInv.getInv().getFluidInTank(0); - if (!fluidInTank.isEmpty() && !fluidInTank.getFluid().getRegistryName().toString().equals(fluid)) { - continue; - } - - current -= fInv.getInv().fill(new FluidStack(ForgeRegistries.FLUIDS.getValue(RLUtils.toRL(fluid)), current), IFluidHandler.FluidAction.SIMULATE); - if (current <= 0) { - return true; - } - } - } - return false; - } - - @Override - public ResourceLocation getName() { - return new ResourceLocation(MM.ID, "fluids"); - } - - @SneakyThrows - @Override - public void validateDefinition() { - if (!RLUtils.isRL(fluid)) { - throw new InvalidProcessDefinitionException("Fluid: " + fluid + " is not a valid id (ResourceLocation)"); - } - if (!ForgeRegistries.FLUIDS.containsKey(RLUtils.toRL(fluid))) { - throw new InvalidProcessDefinitionException("Fluid: " + fluid + " does not exist in the game's registered fluids"); - } - } - - @Override - public void render(MatrixStack ms, int x, int y, int mouseX, int mouseY, IJeiHelpers helpers) { - IDrawableStatic slot = helpers.getGuiHelper().getSlotDrawable(); - slot.draw(ms, x, y); - } - - - @Override - public void setupRecipe(IRecipeLayout layout, Integer typeIndex, int x, int y, boolean input) { - layout.getFluidStacks().init(typeIndex, input, x + 1, y + 1, 16, 16, amount, false, null); - layout.getFluidStacks().set(typeIndex, new FluidStack(ForgeRegistries.FLUIDS.getValue(RLUtils.toRL(fluid)), amount)); - if (this.getChance() < 1){ - layout.getFluidStacks().addTooltipCallback((s, a, b, c) -> { - if (s == typeIndex) { - c.add(new StringTextComponent("Chance: " + this.getChance() * 100 + "%")); - } - }); - } - } - - @Override - public IIngredientType getJeiIngredientType() { - return VanillaTypes.FLUID; - } - - @Override - public List getIngredient(boolean input) { - return (List) ImmutableList.of(new FluidStack(ForgeRegistries.FLUIDS.getValue(RLUtils.toRL(fluid)), amount)); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/state/ItemPortState.java b/src/main/java/com/ticticboooom/mods/mm/ports/state/ItemPortState.java deleted file mode 100644 index 3402f0e..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/state/ItemPortState.java +++ /dev/null @@ -1,277 +0,0 @@ -package com.ticticboooom.mods.mm.ports.state; - -import com.google.common.collect.ImmutableList; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.exception.InvalidProcessDefinitionException; -import com.ticticboooom.mods.mm.helper.RLUtils; -import com.ticticboooom.mods.mm.nbt.NBTPopulate; -import com.ticticboooom.mods.mm.nbt.NBTValidator; -import com.ticticboooom.mods.mm.nbt.model.NBTModel; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import com.ticticboooom.mods.mm.ports.storage.ItemPortStorage; -import lombok.Getter; -import lombok.Setter; -import lombok.SneakyThrows; -import mezz.jei.api.constants.VanillaTypes; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.gui.drawable.IDrawableStatic; -import mezz.jei.api.helpers.IJeiHelpers; -import mezz.jei.api.ingredients.IIngredientType; -import mezz.jei.api.ingredients.IIngredients; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.tags.ITag; -import net.minecraft.tags.ItemTags; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.StringTextComponent; -import net.minecraftforge.registries.ForgeRegistries; -import org.apache.http.annotation.Immutable; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public class ItemPortState extends PortState { - - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.INT.fieldOf("count").forGetter(z -> z.count), - Codec.STRING.optionalFieldOf("item").forGetter(z -> Optional.ofNullable(z.item)), - Codec.STRING.optionalFieldOf("tag").forGetter(z -> Optional.ofNullable(z.tag)) - ).apply(x, (c, i, t) -> new ItemPortState(c, i.orElse(""), t.orElse("")))); - - @Getter - private final int count; - private final String item; - private final String tag; - @Getter - @Setter - private NBTModel nbt; - - public ItemPortState(int count, String item, String tag) { - this.count = count; - this.item = item; - this.tag = tag; - nbt = null; - } - - @Override - public void processRequirement(List storage) { - int current = count; - for (PortStorage inv : storage) { - if (inv instanceof ItemPortStorage) { - ItemPortStorage iinv = (ItemPortStorage) inv; - for (int i = 0; i < iinv.getInv().getSlots(); i++) { - ItemStack stackInSlot = iinv.getInv().getStackInSlot(i); - if (stackInSlot.isEmpty()) { - continue; - } - - if (!item.equals("")) { - if (stackInSlot.getItem().getRegistryName().toString().equals(item)) { - int amount = stackInSlot.getCount(); - stackInSlot.setCount(amount - (amount - current < 0 ? amount : current)); - current -= amount; - } - } else if (!tag.equals("")) { - if (ItemTags.getCollection().get(RLUtils.toRL(tag)).contains(stackInSlot.getItem())) { - int amount = stackInSlot.getCount(); - stackInSlot.setCount(amount - (amount - current < 0 ? amount : current)); - current -= amount; - - } - } - if (current <= 0) { - return; - } - } - } - } - } - - @Override - public boolean validateRequirement(List storage) { - int current = count; - for (PortStorage inv : storage) { - if (inv instanceof ItemPortStorage) { - ItemPortStorage iinv = (ItemPortStorage) inv; - for (int i = 0; i < iinv.getInv().getSlots(); i++) { - ItemStack stackInSlot = iinv.getInv().getStackInSlot(i); - if (stackInSlot.isEmpty()) { - continue; - } - - if (!item.equals("")) { - if (stackInSlot.getItem().getRegistryName().toString().equals(item)) { - current -= stackInSlot.getCount(); - if (nbt != null) { - if (!NBTValidator.isValid(stackInSlot.getTag(), nbt)) { - return false; - } - } - } - } else if (!tag.equals("")) { - ITag tag = ItemTags.getCollection().get(RLUtils.toRL(this.tag)); - if (tag != null && tag.contains(stackInSlot.getItem())) { - current -= stackInSlot.getCount(); - if (nbt != null) { - if (!NBTValidator.isValid(stackInSlot.getTag(), nbt)) { - return false; - } - } - } - } - if (current <= 0) { - return true; - } - } - } - } - return false; - } - - @Override - public void processResult(List storage) { - int current = 0; - for (PortStorage inv : storage) { - if (inv instanceof ItemPortStorage) { - ItemPortStorage iinv = (ItemPortStorage) inv; - for (int i = 0; i < iinv.getInv().getSlots(); i++) { - ItemStack stackInSlot = iinv.getInv().getStackInSlot(i); - - if (!item.equals("")) { - if (stackInSlot.getItem().getRegistryName().toString().equals(item)) { - int amount = stackInSlot.getCount(); - int increment = Math.min((stackInSlot.getItem().getMaxStackSize() - amount), (count - current)); - stackInSlot.setCount(stackInSlot.getCount() + increment); - current += increment; - if (nbt != null){ - stackInSlot.setTag(NBTPopulate.populate(stackInSlot.getTag(), nbt)); - } - } else if (stackInSlot.isEmpty()) { - Item forgeItem = ForgeRegistries.ITEMS.getValue(RLUtils.toRL(item)); - iinv.getInv().setStackInSlot(i, new ItemStack(forgeItem, Math.min(forgeItem.getMaxStackSize(), count - current))); - current += Math.min(forgeItem.getMaxStackSize(), count - current); - if (nbt != null){ - stackInSlot.setTag(NBTPopulate.populate(stackInSlot.getTag(), nbt)); - } - } - } - if (current >= count) { - break; - } - } - } - } - } - - @Override - public boolean validateResult(List storage) { - int current = 0; - for (PortStorage inv : storage) { - if (inv instanceof ItemPortStorage) { - ItemPortStorage iinv = (ItemPortStorage) inv; - for (int i = 0; i < iinv.getInv().getSlots(); i++) { - ItemStack stackInSlot = iinv.getInv().getStackInSlot(i); - if (stackInSlot.isEmpty()) { - if (!item.equals("")) { - current += ForgeRegistries.ITEMS.getValue(RLUtils.toRL(item)).getMaxStackSize(); - } - if (current >= count) { - return true; - } - continue; - } - - if (!item.equals("")) { - if (stackInSlot.getItem().getRegistryName().toString().equals(item)) { - current += stackInSlot.getMaxStackSize() - stackInSlot.getCount(); - } - } - if (current >= count) { - return true; - } - } - } - } - return false; - } - - @Override - public ResourceLocation getName() { - return new ResourceLocation(MM.ID, "items"); - } - - @SneakyThrows - @Override - public void validateDefinition() { - if (!item.equals("")) { - if (!RLUtils.isRL(item)) { - throw new InvalidProcessDefinitionException("Item: " + item + " is not a valid item id (ResourceLocation)"); - } - - if (!ForgeRegistries.ITEMS.containsKey(RLUtils.toRL(item))) { - throw new InvalidProcessDefinitionException("Item: " + item + " does not exist in the game's item registry"); - } - } else if (!tag.equals("")) { - if (!RLUtils.isRL(tag)) { - throw new InvalidProcessDefinitionException("Item Tag: " + tag + " is not a valid item tag id (ResourceLocation)"); - } - } else { - throw new InvalidProcessDefinitionException("You must define a item id or item tag id in the items 'data' object"); - } - } - - private int tagIndex = 0; - private int tagIndexIncremement = 0; - - @Override - public void render(MatrixStack ms, int x, int y, int mouseX, int mouseY, IJeiHelpers helpers) { - IDrawableStatic slot = helpers.getGuiHelper().getSlotDrawable(); - slot.draw(ms, x, y); - } - - @Override - public List getIngredient(boolean input) { - if (!item.equals("") && RLUtils.isRL(item)) { - return (List) ImmutableList.of(new ItemStack(ForgeRegistries.ITEMS.getValue(RLUtils.toRL(item)), this.count)); - } else if (!tag.equals("") && RLUtils.isRL(tag)) { - ITag tag = ItemTags.getCollection().get(RLUtils.toRL(this.tag)); - assert tag != null; - - List stacks = new ArrayList<>(); - tag.getAllElements().forEach(z -> stacks.add(new ItemStack(z, this.count))); - return (List) stacks; - } - return new ArrayList<>(); - } - - @Override - public void setupRecipe(IRecipeLayout layout, Integer typeIndex, int x, int y, boolean input) { - layout.getItemStacks().init(typeIndex, input, x, y); - if (!item.equals("") && RLUtils.isRL(item)) { - layout.getItemStacks().set(typeIndex, new ItemStack(ForgeRegistries.ITEMS.getValue(RLUtils.toRL(item)), this.count)); - } else if (!tag.equals("") && RLUtils.isRL(tag)) { - ITag tag = ItemTags.getCollection().get(RLUtils.toRL(this.tag)); - assert tag != null; - Stream itemStackStream = tag.getAllElements().stream().map(z -> new ItemStack(z.getItem(), this.count)); - layout.getItemStacks().set(typeIndex, itemStackStream.collect(Collectors.toList())); - } - if (this.getChance() < 1) { - layout.getItemStacks().addTooltipCallback((s, a, b, c) -> { - if (s == typeIndex) { - c.add(new StringTextComponent("Chance: " + this.getChance() * 100 + "%")); - } - }); - } - } - - @Override - public IIngredientType getJeiIngredientType() { - return VanillaTypes.ITEM; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/state/ManaPortState.java b/src/main/java/com/ticticboooom/mods/mm/ports/state/ManaPortState.java deleted file mode 100644 index 170b114..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/state/ManaPortState.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.ticticboooom.mods.mm.ports.state; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.client.jei.MMJeiPlugin; -import com.ticticboooom.mods.mm.inventory.botania.PortManaInventory; -import com.ticticboooom.mods.mm.ports.storage.ManaPortStorage; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import lombok.Getter; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.gui.drawable.IDrawableStatic; -import mezz.jei.api.gui.ingredient.IGuiIngredientGroup; -import mezz.jei.api.helpers.IJeiHelpers; -import mezz.jei.api.ingredients.IIngredientType; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.StringTextComponent; - -import java.util.List; - -public class ManaPortState extends PortState { - - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.INT.fieldOf("amount").forGetter(z -> z.amount) - ).apply(x, ManaPortState::new)); - - - @Getter - private final int amount; - - public ManaPortState(int amount) { - this.amount = amount; - - } - - @Override - public void processRequirement(List storage) { - int current = amount; - for (PortStorage portStorage : storage) { - if (portStorage instanceof ManaPortStorage) { - ManaPortStorage inv = (ManaPortStorage) portStorage; - current -= inv.getInv().extractMana(current, false); - if (current <= 0){ - return; - } - } - } - } - - @Override - public boolean validateRequirement(List storage) { - int current = amount; - for (PortStorage portStorage : storage) { - if (portStorage instanceof ManaPortStorage) { - ManaPortStorage inv = (ManaPortStorage) portStorage; - current -= inv.getInv().extractMana(current, true); - if (current <= 0) { - return true; - } - } - } - return false; - } - - @Override - public void processResult(List storage) { - int current = amount; - for (PortStorage portStorage : storage) { - if (portStorage instanceof ManaPortStorage) { - ManaPortStorage inv = (ManaPortStorage) portStorage; - current -= inv.getInv().receiveMana(current, false); - if (current <= 0) { - return; - } - } - } - } - - @Override - public boolean validateResult(List storage) { - int current = amount; - for (PortStorage portStorage : storage) { - if (portStorage instanceof ManaPortStorage) { - ManaPortStorage inv = (ManaPortStorage) portStorage; - current -= inv.getInv().receiveMana(current, true); - if (current <= 0) { - return true; - } - } - } - return false; - } - - @Override - public ResourceLocation getName() { - return new ResourceLocation(MM.ID, "botania_mana"); - } - - @Override - public void render(MatrixStack ms, int x, int y, int mouseX, int mouseY, IJeiHelpers helpers) { - IDrawableStatic drawable = helpers.getGuiHelper().createDrawable(new ResourceLocation(MM.ID, "textures/gui/slot_parts.png"), 18, 61, 18, 18); - drawable.draw(ms, x, y); - } - - @Override - public void setupRecipe(IRecipeLayout layout, Integer typeIndex, int x, int y, boolean input) { - IGuiIngredientGroup group = layout.getIngredientsGroup(MMJeiPlugin.MANA_TYPE); - group.init(typeIndex, input, x + 1, y + 1); - group.set(typeIndex, new PortManaInventory(amount, 0)); - if (this.getChance() < 1) { - group.addTooltipCallback((s, a, b, c) -> { - if (s == typeIndex) { - c.add(new StringTextComponent("Chance: " + this.getChance() * 100 + "%")); - } - }); - } - } - - @Override - public IIngredientType getJeiIngredientType() { - return MMJeiPlugin.MANA_TYPE; - } -} \ No newline at end of file diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/state/MekGasPortState.java b/src/main/java/com/ticticboooom/mods/mm/ports/state/MekGasPortState.java deleted file mode 100644 index 134b33b..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/state/MekGasPortState.java +++ /dev/null @@ -1,158 +0,0 @@ -package com.ticticboooom.mods.mm.ports.state; - -import com.google.common.collect.ImmutableList; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.exception.InvalidProcessDefinitionException; -import com.ticticboooom.mods.mm.helper.RLUtils; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import com.ticticboooom.mods.mm.ports.storage.MekGasPortStorage; -import lombok.SneakyThrows; -import mekanism.api.Action; -import mekanism.api.MekanismAPI; -import mekanism.api.chemical.gas.GasStack; -import mekanism.client.jei.ChemicalStackRenderer; -import mekanism.client.jei.MekanismJEI; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.gui.drawable.IDrawableStatic; -import mezz.jei.api.gui.ingredient.IGuiIngredientGroup; -import mezz.jei.api.helpers.IJeiHelpers; -import mezz.jei.api.ingredients.IIngredientType; -import mezz.jei.api.ingredients.IIngredients; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.StringTextComponent; - -import java.util.List; -import java.util.Objects; - -public class MekGasPortState extends PortState { - - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.STRING.fieldOf("gas").forGetter(z -> z.gas), - Codec.LONG.fieldOf("amount").forGetter(z -> z.amount) - ).apply(x, MekGasPortState::new)); - - private final String gas; - private final long amount; - - public MekGasPortState(String gas, long amount) { - - this.gas = gas; - this.amount = amount; - renderer = new ChemicalStackRenderer<>(amount, false, 16, 16, null); - } - - @Override - public void processRequirement(List storage) { - long current = amount; - for (PortStorage st : storage) { - if (st instanceof MekGasPortStorage) { - MekGasPortStorage gasStorage = (MekGasPortStorage) st; - GasStack extract = gasStorage.getInv().extractChemical(0, current, Action.EXECUTE); - current -= extract.getAmount(); - if (current <= 0) { - return; - } - } - } - } - - @Override - public boolean validateRequirement(List storage) { - long current = amount; - for (PortStorage st : storage) { - if (st instanceof MekGasPortStorage) { - MekGasPortStorage gasStorage = (MekGasPortStorage) st; - if (gasStorage.getInv().getStack().getType().getRegistryName().toString().equals(gas)) { - GasStack extract = gasStorage.getInv().extractChemical(0, current, Action.SIMULATE); - current -= extract.getAmount(); - } - if (current <= 0) { - return true; - } - } - } - return false; - } - - @Override - public void processResult(List storage) { - long current = amount; - for (PortStorage st : storage) { - if (st instanceof MekGasPortStorage) { - MekGasPortStorage gasStorage = (MekGasPortStorage) st; - GasStack extract = gasStorage.getInv().insertChemical(new GasStack(Objects.requireNonNull(MekanismAPI.gasRegistry().getValue(RLUtils.toRL(gas))), current), Action.EXECUTE); - current -= current - extract.getAmount(); - if (current <= 0) { - return; - } - } - } - } - - @Override - public boolean validateResult(List storage) { - long current = amount; - for (PortStorage st : storage) { - if (st instanceof MekGasPortStorage) { - MekGasPortStorage gasStorage = (MekGasPortStorage) st; - GasStack extract = gasStorage.getInv().insertChemical(new GasStack(Objects.requireNonNull(MekanismAPI.gasRegistry().getValue(RLUtils.toRL(gas))), current), Action.SIMULATE); - current -= current - extract.getAmount(); - if (current <= 0) { - return true; - } - } - } - return false; - } - - @Override - public ResourceLocation getName() { - return new ResourceLocation(MM.ID, "mekanism_gas"); - } - - @SneakyThrows - @Override - public void validateDefinition() { - if (!RLUtils.isRL(gas)){ - throw new InvalidProcessDefinitionException("Gas: " + gas + " is not a valid gas id (ResourceLocation)"); - } - - if (!MekanismAPI.gasRegistry().containsKey(RLUtils.toRL(gas))){ - throw new InvalidProcessDefinitionException("Gas: " + gas + " does not exist in the mekansim gas registry"); - } - } - - @Override - public void render(MatrixStack ms, int x, int y, int mouseX, int mouseY, IJeiHelpers helpers) { - IDrawableStatic drawable = helpers.getGuiHelper().getSlotDrawable(); - drawable.draw(ms, x, y); - } - - private final ChemicalStackRenderer renderer; - @Override - public void setupRecipe(IRecipeLayout layout, Integer typeIndex, int x, int y, boolean input) { - IGuiIngredientGroup gasGroup = layout.getIngredientsGroup(MekanismJEI.TYPE_GAS); - gasGroup.init(typeIndex, input, renderer, x + 1, y + 1, 16, 16, 0, 0); - gasGroup.set(typeIndex, new GasStack(MekanismAPI.gasRegistry().getValue(RLUtils.toRL(gas)), amount)); - if (this.getChance() < 1) { - gasGroup.addTooltipCallback((s, a, b, c) -> { - if (s == typeIndex) { - c.add(new StringTextComponent("Chance: " + this.getChance() * 100 + "%")); - } - }); - } - } - - @Override - public List getIngredient(boolean input) { - return (List) ImmutableList.of(new GasStack(MekanismAPI.gasRegistry().getValue(RLUtils.toRL(gas)), amount)); - } - - @Override - public IIngredientType getJeiIngredientType() { - return MekanismJEI.TYPE_GAS; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/state/MekInfusePortState.java b/src/main/java/com/ticticboooom/mods/mm/ports/state/MekInfusePortState.java deleted file mode 100644 index 612c355..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/state/MekInfusePortState.java +++ /dev/null @@ -1,160 +0,0 @@ -package com.ticticboooom.mods.mm.ports.state; - -import com.google.common.collect.ImmutableList; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.exception.InvalidProcessDefinitionException; -import com.ticticboooom.mods.mm.helper.RLUtils; -import com.ticticboooom.mods.mm.ports.storage.MekInfusePortStorage; -import com.ticticboooom.mods.mm.ports.storage.MekSlurryPortStorage; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import lombok.SneakyThrows; -import mekanism.api.Action; -import mekanism.api.MekanismAPI; -import mekanism.api.chemical.infuse.InfusionStack; -import mekanism.api.chemical.slurry.SlurryStack; -import mekanism.client.jei.ChemicalStackRenderer; -import mekanism.client.jei.MekanismJEI; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.gui.drawable.IDrawableStatic; -import mezz.jei.api.gui.ingredient.IGuiIngredientGroup; -import mezz.jei.api.helpers.IJeiHelpers; -import mezz.jei.api.ingredients.IIngredientType; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.StringTextComponent; - -import java.util.List; -import java.util.Objects; - -public class MekInfusePortState extends PortState { - - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.STRING.fieldOf("infuse").forGetter(z -> z.infuse), - Codec.LONG.fieldOf("amount").forGetter(z -> z.amount) - ).apply(x, MekInfusePortState::new)); - - private final String infuse; - private final long amount; - - public MekInfusePortState(String gas, long amount) { - this.infuse = gas; - this.amount = amount; - renderer = new ChemicalStackRenderer<>(amount, false, 16, 16, null); - } - - @Override - public void processRequirement(List storage) { - long current = amount; - for (PortStorage st : storage) { - if (st instanceof MekSlurryPortStorage) { - MekInfusePortStorage gasStorage = (MekInfusePortStorage) st; - if (gasStorage.getInv().getStack().getType().getRegistryName().toString().equals(infuse)) { - InfusionStack extract = gasStorage.getInv().extractChemical(0, current, Action.EXECUTE); - current -= extract.getAmount(); - } - if (current <= 0){ - return; - } - } - } - } - - @Override - public boolean validateRequirement(List storage) { - long current = amount; - for (PortStorage st : storage) { - if (st instanceof MekInfusePortStorage) { - MekInfusePortStorage gasStorage = (MekInfusePortStorage) st; - if (gasStorage.getInv().getStack().getType().getRegistryName().toString().equals(infuse)) { - InfusionStack extract = gasStorage.getInv().extractChemical(0, current, Action.SIMULATE); - current -= extract.getAmount(); - } - if (current <= 0) { - return true; - } - } - } - return false; - } - - @Override - public void processResult(List storage) { - long current = amount; - for (PortStorage st : storage) { - if (st instanceof MekInfusePortStorage) { - MekInfusePortStorage gasStorage = (MekInfusePortStorage) st; - InfusionStack extract = gasStorage.getInv().insertChemical(new InfusionStack(Objects.requireNonNull(MekanismAPI.infuseTypeRegistry().getValue(RLUtils.toRL(infuse))), current), Action.EXECUTE); - current -= current - extract.getAmount(); - if (current <= 0) { - return; - } - } - } - } - - @Override - public boolean validateResult(List storage) { - long current = amount; - for (PortStorage st : storage) { - if (st instanceof MekInfusePortStorage) { - MekInfusePortStorage gasStorage = (MekInfusePortStorage) st; - InfusionStack extract = gasStorage.getInv().insertChemical(new InfusionStack(Objects.requireNonNull(MekanismAPI.infuseTypeRegistry().getValue(RLUtils.toRL(infuse))), current), Action.SIMULATE); - current -= current - extract.getAmount(); - if (current <= 0) { - return true; - } - } - } - return false; - } - - @Override - public ResourceLocation getName() { - return new ResourceLocation(MM.ID, "mekanism_infuse"); - } - - @SneakyThrows - @Override - public void validateDefinition() { - if (!RLUtils.isRL(infuse)){ - throw new InvalidProcessDefinitionException("Infuse Type: " + infuse + " is not a valid infuse type id (ResourceLocation)"); - } - - if (!MekanismAPI.infuseTypeRegistry().containsKey(RLUtils.toRL(infuse))){ - throw new InvalidProcessDefinitionException("Infuse Type: " + infuse + " does not exist in the mekansim infuse type registry"); - } - } - - private final ChemicalStackRenderer renderer; - @Override - public void render(MatrixStack ms, int x, int y, int mouseX, int mouseY, IJeiHelpers helpers) { - IDrawableStatic drawable = helpers.getGuiHelper().getSlotDrawable(); - drawable.draw(ms, x, y); - } - - @Override - public void setupRecipe(IRecipeLayout layout, Integer typeIndex, int x, int y, boolean input) { - IGuiIngredientGroup gasGroup = layout.getIngredientsGroup(MekanismJEI.TYPE_INFUSION); - gasGroup.init(typeIndex, input, renderer, x + 1, y + 1, 16, 16, 0, 0); - gasGroup.set(typeIndex, new InfusionStack(MekanismAPI.infuseTypeRegistry().getValue(RLUtils.toRL(infuse)), amount)); - if (this.getChance() < 1) { - gasGroup.addTooltipCallback((s, a, b, c) -> { - if (s == typeIndex) { - c.add(new StringTextComponent("Chance: " + this.getChance() * 100 + "%")); - } - }); - } - } - - @Override - public List getIngredient(boolean input) { - return (List) ImmutableList.of(new InfusionStack(MekanismAPI.infuseTypeRegistry().getValue(RLUtils.toRL(infuse)), amount)); - } - - @Override - public IIngredientType getJeiIngredientType() { - return MekanismJEI.TYPE_INFUSION; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/state/MekSlurryPortState.java b/src/main/java/com/ticticboooom/mods/mm/ports/state/MekSlurryPortState.java deleted file mode 100644 index b27901f..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/state/MekSlurryPortState.java +++ /dev/null @@ -1,160 +0,0 @@ -package com.ticticboooom.mods.mm.ports.state; - -import com.google.common.collect.ImmutableList; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.exception.InvalidProcessDefinitionException; -import com.ticticboooom.mods.mm.helper.RLUtils; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import com.ticticboooom.mods.mm.ports.storage.MekSlurryPortStorage; -import lombok.SneakyThrows; -import mekanism.api.Action; -import mekanism.api.MekanismAPI; -import mekanism.api.chemical.gas.GasStack; -import mekanism.api.chemical.slurry.SlurryStack; -import mekanism.client.jei.ChemicalStackRenderer; -import mekanism.client.jei.MekanismJEI; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.gui.drawable.IDrawableStatic; -import mezz.jei.api.gui.ingredient.IGuiIngredientGroup; -import mezz.jei.api.helpers.IJeiHelpers; -import mezz.jei.api.ingredients.IIngredientType; -import mezz.jei.api.ingredients.IIngredients; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.StringTextComponent; - -import java.util.List; -import java.util.Objects; - -public class MekSlurryPortState extends PortState { - - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.STRING.fieldOf("slurry").forGetter(z -> z.slurry), - Codec.LONG.fieldOf("amount").forGetter(z -> z.amount) - ).apply(x, MekSlurryPortState::new)); - - private final String slurry; - private final long amount; - - public MekSlurryPortState(String gas, long amount) { - this.slurry = gas; - this.amount = amount; - renderer = new ChemicalStackRenderer<>(amount, false, 16, 16, null); - } - - @Override - public void processRequirement(List storage) { - long current = amount; - for (PortStorage st : storage) { - if (st instanceof MekSlurryPortStorage) { - MekSlurryPortStorage gasStorage = (MekSlurryPortStorage) st; - if (gasStorage.getInv().getStack().getType().getRegistryName().toString().equals(slurry)) { - SlurryStack extract = gasStorage.getInv().extractChemical(0, current, Action.EXECUTE); - current -= extract.getAmount(); - } - if (current <= 0){ - return; - } - } - } - } - - @Override - public boolean validateRequirement(List storage) { - long current = amount; - for (PortStorage st : storage) { - if (st instanceof MekSlurryPortStorage) { - MekSlurryPortStorage gasStorage = (MekSlurryPortStorage) st; - if (gasStorage.getInv().getStack().getType().getRegistryName().toString().equals(slurry)) { - SlurryStack extract = gasStorage.getInv().extractChemical(0, current, Action.SIMULATE); - current -= extract.getAmount(); - } - if (current <= 0) { - return true; - } - } - } - return false; - } - - @Override - public void processResult(List storage) { - long current = amount; - for (PortStorage st : storage) { - if (st instanceof MekSlurryPortStorage) { - MekSlurryPortStorage gasStorage = (MekSlurryPortStorage) st; - SlurryStack extract = gasStorage.getInv().insertChemical(new SlurryStack(Objects.requireNonNull(MekanismAPI.slurryRegistry().getValue(RLUtils.toRL(slurry))), current), Action.EXECUTE); - current -= current - extract.getAmount(); - if (current <= 0) { - return; - } - } - } - } - - @Override - public boolean validateResult(List storage) { - long current = amount; - for (PortStorage st : storage) { - if (st instanceof MekSlurryPortStorage) { - MekSlurryPortStorage gasStorage = (MekSlurryPortStorage) st; - SlurryStack extract = gasStorage.getInv().insertChemical(new SlurryStack(Objects.requireNonNull(MekanismAPI.slurryRegistry().getValue(RLUtils.toRL(slurry))), current), Action.SIMULATE); - current -= current - extract.getAmount(); - if (current <= 0) { - return true; - } - } - } - return false; - } - - @Override - public ResourceLocation getName() { - return new ResourceLocation(MM.ID, "mekanism_slurry"); - } - - @SneakyThrows - @Override - public void validateDefinition() { - if (!RLUtils.isRL(slurry)){ - throw new InvalidProcessDefinitionException("Slurry: " + slurry + " is not a valid slurry id (ResourceLocation)"); - } - - if (!MekanismAPI.slurryRegistry().containsKey(RLUtils.toRL(slurry))){ - throw new InvalidProcessDefinitionException("Slurry: " + slurry + " does not exist in the mekansim slurry registry"); - } - } - - private final ChemicalStackRenderer renderer; - @Override - public void render(MatrixStack ms, int x, int y, int mouseX, int mouseY, IJeiHelpers helpers) { - IDrawableStatic drawable = helpers.getGuiHelper().getSlotDrawable(); - drawable.draw(ms, x, y); - } - - @Override - public void setupRecipe(IRecipeLayout layout, Integer typeIndex, int x, int y, boolean input) { - IGuiIngredientGroup gasGroup = layout.getIngredientsGroup(MekanismJEI.TYPE_SLURRY); - gasGroup.init(typeIndex, input, renderer, x + 1, y + 1, 16, 16, 0, 0); - gasGroup.set(typeIndex, new SlurryStack(MekanismAPI.slurryRegistry().getValue(RLUtils.toRL(slurry)), amount)); - if (this.getChance() < 1) { - gasGroup.addTooltipCallback((s, a, b, c) -> { - if (s == typeIndex) { - c.add(new StringTextComponent("Chance: " + this.getChance() * 100 + "%")); - } - }); - } - } - - @Override - public List getIngredient(boolean input) { - return (List) ImmutableList.of(new SlurryStack(MekanismAPI.slurryRegistry().getValue(RLUtils.toRL(slurry)), amount)); - } - - @Override - public IIngredientType getJeiIngredientType() { - return MekanismJEI.TYPE_SLURRY; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/state/PneumaticPortState.java b/src/main/java/com/ticticboooom/mods/mm/ports/state/PneumaticPortState.java deleted file mode 100644 index d919efe..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/state/PneumaticPortState.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.ticticboooom.mods.mm.ports.state; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.client.jei.MMJeiPlugin; -import com.ticticboooom.mods.mm.client.jei.ingredients.model.PressureStack; -import com.ticticboooom.mods.mm.ports.storage.PneumaticPortStorage; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.gui.drawable.IDrawableStatic; -import mezz.jei.api.gui.ingredient.IGuiIngredientGroup; -import mezz.jei.api.helpers.IJeiHelpers; -import mezz.jei.api.ingredients.IIngredientType; -import net.minecraft.util.ResourceLocation; - -import java.util.List; - -public class PneumaticPortState extends PortState { - - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.FLOAT.fieldOf("air").forGetter(z -> z.pressure) - ).apply(x, PneumaticPortState::new)); - - private float pressure; - - public PneumaticPortState(float pressure) { - this.pressure = pressure; - } - - @Override - public void processRequirement(List storage) { - for (PortStorage portStorage : storage) { - if (portStorage instanceof PneumaticPortStorage){ - PneumaticPortStorage pnc = (PneumaticPortStorage) portStorage; - pnc.getInv().addAir(-(int) pressure); - } - } - } - - @Override - public boolean validateRequirement(List storage) { - for (PortStorage portStorage : storage) { - if (portStorage instanceof PneumaticPortStorage){ - if (((PneumaticPortStorage) portStorage).getInv().getAir() >= this.pressure){ - return true; - } - } - } - return false; - } - - @Override - public void processResult(List storage) { - for (PortStorage portStorage : storage) { - if (portStorage instanceof PneumaticPortStorage){ - PneumaticPortStorage pnc = (PneumaticPortStorage) portStorage; - pnc.getInv().addAir((int)pressure); - } - } - } - - @Override - public boolean validateResult(List storage) { - for (PortStorage portStorage : storage) { - if (portStorage instanceof PneumaticPortStorage){ - return true; - } - } - return false; - } - - @Override - public ResourceLocation getName() { - return new ResourceLocation(MM.ID, "pncr_pressure"); - } - - @Override - public IIngredientType getJeiIngredientType() { - return MMJeiPlugin.PRESSURE_TYPE; - } - - @Override - public List getIngredient(boolean input) { - return (List) Lists.newArrayList(new PressureStack(pressure)); - } - - @Override - public void setupRecipe(IRecipeLayout layout, Integer typeIndex, int x, int y, boolean input) { - IGuiIngredientGroup group = layout.getIngredientsGroup(MMJeiPlugin.PRESSURE_TYPE); - group.init(typeIndex, input, x+ 1, y +1); - group.set(typeIndex, new PressureStack(pressure)); - } - - @Override - public void render(MatrixStack ms, int x, int y, int mouseX, int mouseY, IJeiHelpers helpers) { - IDrawableStatic slot = helpers.getGuiHelper().getSlotDrawable(); - slot.draw(ms, x, y); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/state/PortState.java b/src/main/java/com/ticticboooom/mods/mm/ports/state/PortState.java deleted file mode 100644 index 285ce61..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/state/PortState.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.ticticboooom.mods.mm.ports.state; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import lombok.Getter; -import lombok.Setter; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.helpers.IJeiHelpers; -import mezz.jei.api.ingredients.IIngredientType; -import mezz.jei.api.ingredients.IIngredients; -import net.minecraft.util.ResourceLocation; - -import java.util.ArrayList; -import java.util.List; - -public abstract class PortState { - @Getter - @Setter - private boolean consumePerTick = false; - - @Getter - @Setter - private double chance = 0; - - @Getter - @Setter - private boolean instantConsume = false; - public abstract void processRequirement(List storage); - public abstract boolean validateRequirement(List storage); - public abstract void processResult(List storage); - public abstract boolean validateResult(List storage); - public abstract ResourceLocation getName(); - public void validateDefinition() {} - public void render(MatrixStack ms, int x, int y, int mouseX, int mouseY, IJeiHelpers helpers) {} - public abstract IIngredientType getJeiIngredientType(); - public List getIngredient(boolean input) { - return new ArrayList<>(); - } - public boolean supportsChances() { - return true; - } - public boolean supportsPerTick(){ - return true; - } - public void setupRecipe(IRecipeLayout layout, Integer typeIndex, int x, int y, boolean input) { - - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/state/RotationPortState.java b/src/main/java/com/ticticboooom/mods/mm/ports/state/RotationPortState.java deleted file mode 100644 index dfb3516..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/state/RotationPortState.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.ticticboooom.mods.mm.ports.state; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.client.jei.MMJeiPlugin; -import com.ticticboooom.mods.mm.client.jei.ingredients.model.PressureStack; -import com.ticticboooom.mods.mm.client.jei.ingredients.model.RotationStack; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import com.ticticboooom.mods.mm.ports.storage.RotationPortStorage; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.gui.drawable.IDrawableStatic; -import mezz.jei.api.gui.ingredient.IGuiIngredientGroup; -import mezz.jei.api.helpers.IJeiHelpers; -import mezz.jei.api.ingredients.IIngredientType; -import net.minecraft.util.ResourceLocation; - -import java.util.ArrayList; -import java.util.List; - -public class RotationPortState extends PortState { - - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.FLOAT.fieldOf("speed").forGetter(z -> z.speed) - ).apply(x, RotationPortState::new)); - - private float speed; - - public RotationPortState(float pressure) { - this.speed = pressure; - } - - @Override - public void processRequirement(List storage) { - - } - - @Override - public boolean validateRequirement(List storage) { - for (PortStorage portStorage : storage) { - if (portStorage instanceof RotationPortStorage){ - RotationPortStorage rot = (RotationPortStorage) portStorage; - if (rot.getSpeed() >= speed) { - return true; - } - } - } - return false; - } - - @Override - public void processResult(List storage) { - for (PortStorage portStorage : storage) { - if (portStorage instanceof RotationPortStorage){ - RotationPortStorage rot = (RotationPortStorage) portStorage; - rot.setSpeed(speed); - } - } - } - - @Override - public boolean validateResult(List storage) { - return true; - } - - @Override - public ResourceLocation getName() { - return new ResourceLocation(MM.ID, "create_rotation"); - } - - @Override - public IIngredientType getJeiIngredientType() { - return MMJeiPlugin.PRESSURE_TYPE; - } - - @Override - public List getIngredient(boolean input) { - return new ArrayList<>(); - } - - @Override - public void setupRecipe(IRecipeLayout layout, Integer typeIndex, int x, int y, boolean input) { - IGuiIngredientGroup group = layout.getIngredientsGroup(MMJeiPlugin.ROT_TYPE); - group.init(typeIndex, input, x+ 1, y +1); - group.set(typeIndex, new RotationStack(speed)); - } - - @Override - public void render(MatrixStack ms, int x, int y, int mouseX, int mouseY, IJeiHelpers helpers) { - IDrawableStatic slot = helpers.getGuiHelper().getSlotDrawable(); - slot.draw(ms, x, y); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/state/StarlightPortState.java b/src/main/java/com/ticticboooom/mods/mm/ports/state/StarlightPortState.java deleted file mode 100644 index 0416426..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/state/StarlightPortState.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.ticticboooom.mods.mm.ports.state; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.client.jei.MMJeiPlugin; -import com.ticticboooom.mods.mm.client.jei.ingredients.model.StarlightStack; -import com.ticticboooom.mods.mm.ports.storage.StarlightPortStorage; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.gui.drawable.IDrawableStatic; -import mezz.jei.api.gui.ingredient.IGuiIngredientGroup; -import mezz.jei.api.helpers.IJeiHelpers; -import mezz.jei.api.ingredients.IIngredientType; -import net.minecraft.util.ResourceLocation; - -import java.util.ArrayList; -import java.util.List; - -public class StarlightPortState extends PortState { - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.INT.fieldOf("amount").forGetter(z -> z.amount) - ).apply(x, StarlightPortState::new)); - - private int amount; - - public StarlightPortState(int starlight) { - this.amount = starlight; - } - - @Override - public void processRequirement(List storage) { - int current = amount; - for (PortStorage inv : storage) { - if (inv instanceof StarlightPortStorage) { - StarlightPortStorage StarlightInv = (StarlightPortStorage) inv; - current -= StarlightInv.getInv().extractStarlight(current, false); - if (current <= 0) { - return; - } - } - } - } - - @Override - public boolean validateRequirement(List storage) { - int current = amount; - for (PortStorage inv : storage) { - if (inv instanceof StarlightPortStorage) { - StarlightPortStorage StarlightInv = (StarlightPortStorage) inv; - current -= StarlightInv.getInv().extractStarlight(current, true); - if (current <= 0) { - return true; - } - } - } - return false; - } - - @Override - public void processResult(List storage) { - - int current = amount; - for (PortStorage inv : storage) { - if (inv instanceof StarlightPortStorage) { - StarlightPortStorage StarlightInv = (StarlightPortStorage) inv; - current -= StarlightInv.getInv().receiveStarlight(current, false); - if (current <= 0) { - return; - } - } - } - } - - @Override - public boolean validateResult(List storage) { - int current = amount; - for (PortStorage inv : storage) { - if (inv instanceof StarlightPortStorage) { - StarlightPortStorage StarlightInv = (StarlightPortStorage) inv; - current -= StarlightInv.getInv().receiveStarlight(current, true); - if (current <= 0) { - return true; - } - } - } - return false; - } - - @Override - public ResourceLocation getName() { - return new ResourceLocation(MM.ID, "astral_starlight"); - } - - @Override - public IIngredientType getJeiIngredientType() { - return MMJeiPlugin.PRESSURE_TYPE; - } - - @Override - public List getIngredient(boolean input) { - return new ArrayList<>(); - } - - @Override - public void setupRecipe(IRecipeLayout layout, Integer typeIndex, int x, int y, boolean input) { - IGuiIngredientGroup group = layout.getIngredientsGroup(MMJeiPlugin.STAR_TYPE); - group.init(typeIndex, input, x + 1, y+1); - group.set(typeIndex, new StarlightStack(amount)); - } - - @Override - public void render(MatrixStack ms, int x, int y, int mouseX, int mouseY, IJeiHelpers helpers) { - IDrawableStatic slot = helpers.getGuiHelper().getSlotDrawable(); - slot.draw(ms, x, y); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/state/WeatherPortState.java b/src/main/java/com/ticticboooom/mods/mm/ports/state/WeatherPortState.java deleted file mode 100644 index 1adb51d..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/state/WeatherPortState.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.ticticboooom.mods.mm.ports.state; - -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import com.ticticboooom.mods.mm.ports.storage.WeatherPortStorage; -import mezz.jei.api.ingredients.IIngredientType; -import net.minecraft.util.ResourceLocation; - -import java.util.List; -import java.util.Optional; - -public class WeatherPortState extends PortState { - - public static final Codec CODEC= RecordCodecBuilder.create(x -> x.group( - Codec.BOOL.optionalFieldOf("raining").forGetter(z -> z.raining), - Codec.BOOL.optionalFieldOf("thundering").forGetter(z -> z.thundering) - ).apply(x, WeatherPortState::new)); - - private final Optional raining; - private final Optional thundering; - - public WeatherPortState(Optional raining, Optional thundering) { - this.raining = raining; - this.thundering = thundering; - } - - - @Override - public void processRequirement(List storage) { - - } - - @Override - public boolean validateRequirement(List storage) { - for (PortStorage portStorage : storage) { - if (portStorage instanceof WeatherPortStorage){ - WeatherPortStorage weatherPortStorage = (WeatherPortStorage) portStorage; - if (raining.isPresent() && weatherPortStorage.isRaining() != raining.get()) { - return false; - } - if (thundering.isPresent() && weatherPortStorage.isThundering() != thundering.get()) { - return false; - } - } - } - return true; - } - - @Override - public void processResult(List storage) { - - } - - @Override - public boolean validateResult(List storage) { - return false; - } - - @Override - public ResourceLocation getName() { - return null; - } - - @Override - public IIngredientType getJeiIngredientType() { - return null; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/storage/EnergyPortStorage.java b/src/main/java/com/ticticboooom/mods/mm/ports/storage/EnergyPortStorage.java deleted file mode 100644 index c3a5a2f..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/storage/EnergyPortStorage.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.ticticboooom.mods.mm.ports.storage; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.helper.GuiHelper; -import com.ticticboooom.mods.mm.inventory.PortEnergyInventory; -import lombok.Getter; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.AbstractGui; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.energy.CapabilityEnergy; - -public class EnergyPortStorage extends PortStorage { - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.INT.fieldOf("capacity").forGetter(z -> z.inv.getMaxEnergyStored()) - ).apply(x, EnergyPortStorage::new)); - - @Getter - private final PortEnergyInventory inv; - private final LazyOptional invLO; - - public EnergyPortStorage(int capacity) { - this.inv = new PortEnergyInventory(0, capacity); - invLO = LazyOptional.of(() -> this.inv); - } - - @Override - public LazyOptional getLO() { - return invLO.cast(); - } - - @Override - public boolean validate(Capability cap) { - return cap == CapabilityEnergy.ENERGY; - } - - @Override - public CompoundNBT save(CompoundNBT nbt) { - nbt.putInt("stored", inv.getEnergyStored()); - return nbt; - } - - @Override - public void load(CompoundNBT nbt) { - if (nbt.contains("stored")) { - inv.setStored(nbt.getInt("stored")); - } - } - - @Override - public void render(MatrixStack stack, int mouseX, int mouseY, int left, int top, Screen screen) { - Minecraft.getInstance().textureManager.bindTexture(new ResourceLocation(MM.ID, "textures/gui/port_gui.png")); - screen.blit(stack, left, top, 0, 0, 175, 256); - int barX = left + 175 - 30; - int barY = top + 20; - int barWidth = 18; - int barHeight = 108; - screen.blit(stack, barX, barY, 175, 18, barWidth, barHeight); - float pct = 0; - if (inv.getMaxEnergyStored() > 0) { - pct = (float)inv.getEnergyStored() / inv.getMaxEnergyStored(); - } - GuiHelper.renderVerticallyFilledBar(stack, screen, barX, barY, 193, 18, barWidth, barHeight, pct); - AbstractGui.drawString(stack, Minecraft.getInstance().fontRenderer,String.format("%.2f",Math.round((float)10000 * pct) / 100.f) + "%", left + 30, top + 60, 0xfefefe); - AbstractGui.drawString(stack, Minecraft.getInstance().fontRenderer, inv.getEnergyStored() + "FE", left + 30, top + 80, 0xfefefe); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/storage/FluidPortStorage.java b/src/main/java/com/ticticboooom/mods/mm/ports/storage/FluidPortStorage.java deleted file mode 100644 index 13a567d..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/storage/FluidPortStorage.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.ticticboooom.mods.mm.ports.storage; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.container.PortBlockContainer; -import com.ticticboooom.mods.mm.block.tile.MachinePortBlockEntity; -import com.ticticboooom.mods.mm.client.util.FluidRenderer; -import com.ticticboooom.mods.mm.inventory.PortFluidInventory; -import lombok.Getter; -import net.minecraft.block.BlockState; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.AbstractGui; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.container.Slot; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.Hand; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.world.World; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidUtil; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; - -public class FluidPortStorage extends PortStorage { - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.INT.fieldOf("capacity").forGetter(z -> z.inv.getTankCapacity(0)) - ).apply(x, FluidPortStorage::new)); - - - @Getter - private final PortFluidInventory inv; - private final LazyOptional invLO; - - public FluidPortStorage(int capacity) { - this.inv = new PortFluidInventory(capacity); - invLO = LazyOptional.of(() -> this.inv); - } - - @Override - public LazyOptional getLO() { - return invLO.cast(); - } - - @Override - public boolean validate(Capability cap) { - return cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY; - } - - @Override - public CompoundNBT save(CompoundNBT nbt) { - nbt = inv.getFluidInTank(0).writeToNBT(nbt); - return nbt; - } - - @Override - public void load(CompoundNBT nbt) { - inv.setStack(FluidStack.loadFluidStackFromNBT(nbt)); - } - - @Override - public void render(MatrixStack stack, int mouseX, int mouseY, int left, int top, Screen screen) { - Minecraft.getInstance().textureManager.bindTexture(new ResourceLocation(MM.ID, "textures/gui/port_gui.png")); - screen.blit(stack, left, top, 0, 0, 175, 256); - int x = 78; - int y = 40; - screen.blit(stack, left + x, top + y, 175, 0, 18, 18); - FluidStack fluid = inv.getFluidInTank(0); - if (!fluid.isEmpty()){ - FluidRenderer.INSTANCE.render(stack, left + x + 1, top + y + 1, inv.getFluidInTank(0), 16); - - AbstractGui.drawCenteredString(stack, Minecraft.getInstance().fontRenderer, inv.getFluidInTank(0).getAmount() + " " + inv.getFluidInTank(0).getDisplayName().getString(), left + x + 9 + 1, top + y + 30, 0xfefefe); - } - } - - @Override - public boolean onPortActivated(BlockState state, World level, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult traceResult) { - return FluidUtil.interactWithFluidHandler(player, hand, level, pos, traceResult.getFace()); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/storage/ItemPortStorage.java b/src/main/java/com/ticticboooom/mods/mm/ports/storage/ItemPortStorage.java deleted file mode 100644 index a3da28c..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/storage/ItemPortStorage.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.ticticboooom.mods.mm.ports.storage; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.container.PortBlockContainer; -import com.ticticboooom.mods.mm.block.tile.IMachinePortTile; -import com.ticticboooom.mods.mm.block.tile.MachinePortBlockEntity; -import com.ticticboooom.mods.mm.helper.InvHelper; -import com.ticticboooom.mods.mm.inventory.ItemStackInventory; -import lombok.Getter; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.container.Slot; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.items.CapabilityItemHandler; -import net.minecraftforge.items.ItemStackHandler; - -public class ItemPortStorage extends PortStorage { - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.INT.fieldOf("rows").forGetter(z -> z.rows), - Codec.INT.fieldOf("columns").forGetter(z -> z.columns) - ).apply(x, ItemPortStorage::new)); - - @Getter - private final ItemStackHandler inv; - @Getter - private final int rows; - @Getter - private final int columns; - - private final LazyOptional invLO; - - public ItemPortStorage(int rows, int columns) { - this.rows = rows; - this.columns = columns; - this.inv = new ItemStackHandler(rows * columns); - this.invLO = LazyOptional.of(() -> this.inv); - } - - - @Override - public LazyOptional getLO() { - return invLO.cast(); - } - - @Override - public boolean validate(Capability cap) { - return cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY; - } - - @Override - public CompoundNBT save(CompoundNBT nbt) { - CompoundNBT compoundNBT = inv.serializeNBT(); - nbt = nbt.merge(compoundNBT); - return nbt; - } - - @Override - public void load(CompoundNBT nbt) { - inv.deserializeNBT(nbt); - } - - @Override - public void render(MatrixStack stack, int mouseX, int mouseY, int left, int top, Screen screen) { - Minecraft.getInstance().textureManager.bindTexture(new ResourceLocation(MM.ID, "textures/gui/port_gui.png")); - screen.blit(stack, left, top, 0, 0, 175, 256); - int offsetY = ((108 - (rows * 18)) / 2) + 7; - int offsetX = ((162 - (columns * 18)) / 2) + 7; - for (int y = 0; y < rows; y++) { - for (int x = 0; x < columns; x++) { - screen.blit(stack, left + (x * 18) + offsetX, top + (y * 18) + offsetY, 175, 256, 18, 18); - } - } - } - - @Override - public void setupContainer(PortBlockContainer container, PlayerInventory inv, IMachinePortTile tile) { - int offsetX = ((162 - (columns * 18)) / 2) + 8; - int offsetY = ((108 - (rows * 18)) / 2) + 8; - ItemStackInventory items = InvHelper.getItems(this.inv); - for (int y = 0; y < rows; y++) { - for (int x = 0; x < columns; x++) { - container.addSlot(new Slot(items, (y * columns) + x, x * 18 + offsetX, y * 18 + offsetY)); - } - } - super.setupContainer(container, inv, tile); - } - - - - -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/storage/ManaPortStorage.java b/src/main/java/com/ticticboooom/mods/mm/ports/storage/ManaPortStorage.java deleted file mode 100644 index 614899e..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/storage/ManaPortStorage.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.ticticboooom.mods.mm.ports.storage; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.tile.MachinePortBlockEntity; -import com.ticticboooom.mods.mm.helper.GuiHelper; -import com.ticticboooom.mods.mm.inventory.PortEnergyInventory; -import com.ticticboooom.mods.mm.inventory.botania.PortManaInventory; -import lombok.Getter; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.AbstractGui; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.energy.CapabilityEnergy; -import vazkii.botania.api.mana.IManaPool; -import vazkii.botania.api.mana.IManaReceiver; - -import java.util.ArrayList; -import java.util.List; - -public class ManaPortStorage extends PortStorage { - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.INT.fieldOf("capacity").forGetter(z -> z.inv.getMaxManaStored()) - ).apply(x, ManaPortStorage::new)); - - @Getter - private final PortManaInventory inv; - private final LazyOptional invLO; - - public ManaPortStorage(int capacity) { - this.inv = new PortManaInventory(0, capacity); - invLO = LazyOptional.of(() -> this.inv); - } - - @Override - public LazyOptional getLO() { - return invLO.cast(); - } - - @Override - public boolean validate(Capability cap) { - return false; - } - - @Override - public CompoundNBT save(CompoundNBT nbt) { - nbt.putInt("stored", inv.getManaStored()); - return nbt; - } - - @Override - public void load(CompoundNBT nbt) { - if (nbt.contains("stored")) { - inv.setStored(nbt.getInt("stored")); - } - } - - @Override - public void render(MatrixStack stack, int mouseX, int mouseY, int left, int top, Screen screen) { - Minecraft.getInstance().textureManager.bindTexture(new ResourceLocation(MM.ID, "textures/gui/mana_gui.png")); - screen.blit(stack, left, top, 0, 0, 175, 256); - int barOffsetX = 175 - 30; - int barOffsetY = 20; - int barX = left + 175 - 30; - int barY = top + 20; - int barWidth = 18; - int barHeight = 108; - screen.blit(stack, barX, barY, 175, 18, barWidth, barHeight); - float pct = 0; - if (inv.getMaxManaStored() > 0) { - pct = (float)inv.getManaStored() / inv.getMaxManaStored(); - } - GuiHelper.renderVerticallyFilledBar(stack, screen, barX, barY, 193, 18, barWidth, barHeight, pct); - AbstractGui.drawString(stack, Minecraft.getInstance().fontRenderer, inv.getManaStored() + " Mana", left + 30, top + 60, 0xfefefe); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/storage/MekGasPortStorage.java b/src/main/java/com/ticticboooom/mods/mm/ports/storage/MekGasPortStorage.java deleted file mode 100644 index f2caf89..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/storage/MekGasPortStorage.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.ticticboooom.mods.mm.ports.storage; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.helper.GuiHelper; -import com.ticticboooom.mods.mm.helper.RLUtils; -import com.ticticboooom.mods.mm.inventory.mek.PortMekGasInventory; -import lombok.Getter; -import mekanism.api.MekanismAPI; -import mekanism.api.chemical.gas.GasStack; -import mekanism.common.capabilities.Capabilities; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.AbstractGui; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.util.LazyOptional; - -import java.util.Objects; - -public class MekGasPortStorage extends PortStorage { - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.LONG.fieldOf("capacity").forGetter(z -> z.capacity) - ).apply(x, MekGasPortStorage::new)); - @Getter - private final PortMekGasInventory inv; - private long capacity; - private final LazyOptional invLO; - - - public MekGasPortStorage(long capacity) { - inv = new PortMekGasInventory(capacity); - this.capacity = capacity; - invLO = LazyOptional.of(() -> inv); - } - - @Override - public LazyOptional getLO() { - return invLO.cast(); - } - - @Override - public boolean validate(Capability cap) { - return cap == Capabilities.GAS_HANDLER_CAPABILITY; - } - - @Override - public CompoundNBT save(CompoundNBT nbt) { - nbt.putString("gas", inv.getStack().getType().getRegistryName().toString()); - nbt.putLong("amount", inv.getStack().getAmount()); - return nbt; - } - - @Override - public void load(CompoundNBT nbt) { - if (nbt.contains("gas")) { - inv.setStack(new GasStack(Objects.requireNonNull(MekanismAPI.gasRegistry().getValue(RLUtils.toRL(nbt.getString("gas")))), nbt.getLong("amount"))); - } - } - - @Override - public void render(MatrixStack stack, int mouseX, int mouseY, int left, int top, Screen screen) { - Minecraft.getInstance().textureManager.bindTexture(new ResourceLocation(MM.ID, "textures/gui/port_gui.png")); - screen.blit(stack, left, top, 0, 0, 175, 256); - int barX = left + 175 - 30; - int barY = top + 20; - int barWidth = 18; - int barHeight = 108; - screen.blit(stack, barX, barY, 175, 18, barWidth, barHeight); - float pct = 0; - if (inv.getStack().getAmount() > 0) { - pct = (float)inv.getStack().getAmount() / inv.getTankCapacity(0); - } - GuiHelper.renderVerticallyFilledBar(stack, screen, barX, barY, 193, 18, barWidth, barHeight, pct); - AbstractGui.drawString(stack, Minecraft.getInstance().fontRenderer,inv.getStack().getType().getTextComponent().getString(), left + 30, top + 60, 0xfefefe); - AbstractGui.drawString(stack, Minecraft.getInstance().fontRenderer, inv.getStack().getAmount() + "mB", left + 30, top + 80, 0xfefefe); - - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/storage/MekInfusePortStorage.java b/src/main/java/com/ticticboooom/mods/mm/ports/storage/MekInfusePortStorage.java deleted file mode 100644 index b27b943..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/storage/MekInfusePortStorage.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.ticticboooom.mods.mm.ports.storage; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.helper.GuiHelper; -import com.ticticboooom.mods.mm.helper.RLUtils; -import com.ticticboooom.mods.mm.inventory.mek.PortMekInfuseInventory; -import com.ticticboooom.mods.mm.inventory.mek.PortMekSlurryInventory; -import lombok.Getter; -import mekanism.api.MekanismAPI; -import mekanism.api.chemical.infuse.InfusionStack; -import mekanism.api.chemical.slurry.SlurryStack; -import mekanism.common.capabilities.Capabilities; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.AbstractGui; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.util.LazyOptional; - -import java.util.Objects; - -public class MekInfusePortStorage extends PortStorage { - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.LONG.fieldOf("capacity").forGetter(z -> z.capacity) - ).apply(x, MekInfusePortStorage::new)); - - @Getter - private final PortMekInfuseInventory inv; - private long capacity; - private final LazyOptional invLO; - - - public MekInfusePortStorage(long capacity) { - inv = new PortMekInfuseInventory(capacity); - this.capacity = capacity; - invLO = LazyOptional.of(() -> inv); - } - - @Override - public LazyOptional getLO() { - return invLO.cast(); - } - - @Override - public boolean validate(Capability cap) { - return cap == Capabilities.INFUSION_HANDLER_CAPABILITY; - } - - @Override - public CompoundNBT save(CompoundNBT nbt) { - nbt.putString("infuse", inv.getStack().getType().getRegistryName().toString()); - nbt.putLong("amount", inv.getStack().getAmount()); - return nbt; - } - - @Override - public void load(CompoundNBT nbt) { - if (nbt.contains("infuse")){ - inv.setStack(new InfusionStack(Objects.requireNonNull(MekanismAPI.infuseTypeRegistry().getValue(RLUtils.toRL(nbt.getString("infuse")))), nbt.getLong("amount"))); - } - } - - @Override - public void render(MatrixStack stack, int mouseX, int mouseY, int left, int top, Screen screen) { - Minecraft.getInstance().textureManager.bindTexture(new ResourceLocation(MM.ID, "textures/gui/port_gui.png")); - screen.blit(stack, left, top, 0, 0, 175, 256); - int barX = left + 175 - 30; - int barY = top + 20; - int barWidth = 18; - int barHeight = 108; - screen.blit(stack, barX, barY, 175, 18, barWidth, barHeight); - float pct = 0; - if (inv.getStack().getAmount() > 0) { - pct = (float) inv.getStack().getAmount() / inv.getTankCapacity(0); - } - GuiHelper.renderVerticallyFilledBar(stack, screen, barX, barY, 193, 18, barWidth, barHeight, pct); - AbstractGui.drawString(stack, Minecraft.getInstance().fontRenderer, inv.getStack().getType().getTextComponent().getString(), left + 30, top + 60, 0xfefefe); - AbstractGui.drawString(stack, Minecraft.getInstance().fontRenderer, inv.getStack().getAmount() + "mB", left + 30, top + 80, 0xfefefe); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/storage/MekSlurryPortStorage.java b/src/main/java/com/ticticboooom/mods/mm/ports/storage/MekSlurryPortStorage.java deleted file mode 100644 index 8a53595..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/storage/MekSlurryPortStorage.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.ticticboooom.mods.mm.ports.storage; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.container.PortBlockContainer; -import com.ticticboooom.mods.mm.block.tile.MachinePortBlockEntity; -import com.ticticboooom.mods.mm.helper.GuiHelper; -import com.ticticboooom.mods.mm.helper.RLUtils; -import com.ticticboooom.mods.mm.inventory.mek.PortMekSlurryInventory; -import lombok.Getter; -import mekanism.api.MekanismAPI; -import mekanism.api.chemical.infuse.InfuseType; -import mekanism.api.chemical.slurry.SlurryStack; -import mekanism.common.capabilities.Capabilities; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.AbstractGui; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.container.Slot; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.util.LazyOptional; - -import java.util.Objects; - -public class MekSlurryPortStorage extends PortStorage { - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.LONG.fieldOf("capacity").forGetter(z -> z.capacity) - ).apply(x, MekSlurryPortStorage::new)); - - @Getter - private final PortMekSlurryInventory inv; - private long capacity; - private final LazyOptional invLO; - - - public MekSlurryPortStorage(long capacity) { - inv = new PortMekSlurryInventory(capacity); - this.capacity = capacity; - invLO = LazyOptional.of(() -> inv); - } - - @Override - public LazyOptional getLO() { - return invLO.cast(); - } - - @Override - public boolean validate(Capability cap) { - return cap == Capabilities.SLURRY_HANDLER_CAPABILITY; - } - - @Override - public CompoundNBT save(CompoundNBT nbt) { - nbt.putString("slurry", inv.getStack().getType().getRegistryName().toString()); - nbt.putLong("amount", inv.getStack().getAmount()); - return nbt; - } - - @Override - public void load(CompoundNBT nbt) { - if (nbt.contains("slurry")){ - inv.setStack(new SlurryStack(Objects.requireNonNull(MekanismAPI.slurryRegistry().getValue(RLUtils.toRL(nbt.getString("slurry")))), nbt.getLong("amount"))); - } - } - - @Override - public void render(MatrixStack stack, int mouseX, int mouseY, int left, int top, Screen screen) { - Minecraft.getInstance().textureManager.bindTexture(new ResourceLocation(MM.ID, "textures/gui/port_gui.png")); - screen.blit(stack, left, top, 0, 0, 175, 256); - int barX = left + 175 - 30; - int barY = top + 20; - int barWidth = 18; - int barHeight = 108; - screen.blit(stack, barX, barY, 175, 18, barWidth, barHeight); - float pct = 0; - if (inv.getStack().getAmount() > 0) { - pct = (float) inv.getStack().getAmount() / inv.getTankCapacity(0); - } - GuiHelper.renderVerticallyFilledBar(stack, screen, barX, barY, 193, 18, barWidth, barHeight, pct); - AbstractGui.drawString(stack, Minecraft.getInstance().fontRenderer, inv.getStack().getType().getTextComponent().getString(), left + 30, top + 60, 0xfefefe); - AbstractGui.drawString(stack, Minecraft.getInstance().fontRenderer, inv.getStack().getAmount() + "mB", left + 30, top + 80, 0xfefefe); - - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/storage/PneumaticPortStorage.java b/src/main/java/com/ticticboooom/mods/mm/ports/storage/PneumaticPortStorage.java deleted file mode 100644 index 0651dfd..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/storage/PneumaticPortStorage.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.ticticboooom.mods.mm.ports.storage; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.tile.IMachinePortTile; -import com.ticticboooom.mods.mm.block.tile.MachinePortBlockEntity; -import com.ticticboooom.mods.mm.helper.GuiHelper; -import lombok.Getter; -import me.desht.pneumaticcraft.api.PNCCapabilities; -import me.desht.pneumaticcraft.api.tileentity.IAirHandlerMachine; -import me.desht.pneumaticcraft.common.capabilities.MachineAirHandler; -import me.desht.pneumaticcraft.common.util.DirectionUtil; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.AbstractGui; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.util.LazyOptional; - -import java.text.NumberFormat; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class PneumaticPortStorage extends PortStorage { - - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.FLOAT.fieldOf("dangerPressure").forGetter(z -> z.danger), - Codec.FLOAT.fieldOf("criticalPressure").forGetter(z -> z.critical), - Codec.INT.fieldOf("volume").forGetter(z -> z.volume) - ).apply(x, PneumaticPortStorage::new)); - - @Getter - private MachineAirHandler inv; - private final LazyOptional invLO; - private float danger; - private float critical; - private int volume; - private final Map> airHandlerMap = new HashMap<>(); - - public PneumaticPortStorage(float danger, float critical, int volume) { - this.danger = danger; - this.critical = critical; - this.volume = volume; - inv = new MachineAirHandler(danger, critical, volume); - invLO = LazyOptional.of(() -> inv); - neighborChanged(); - } - - @Override - public LazyOptional getLO() { - return invLO.cast(); - } - - @Override - public boolean validate(Capability cap) { - return cap == PNCCapabilities.AIR_HANDLER_MACHINE_CAPABILITY; - } - - @Override - public CompoundNBT save(CompoundNBT nbt) { - nbt.putInt("air", inv.getAir()); - return nbt; - } - - @Override - public void load(CompoundNBT nbt) { - inv.addAir(-inv.getAir()); - inv.addAir(nbt.getInt("air")); - } - - @Override - public void render(MatrixStack stack, int mouseX, int mouseY, int left, int top, Screen screen) { - Minecraft.getInstance().textureManager.bindTexture(new ResourceLocation(MM.ID, "textures/gui/port_gui.png")); - screen.blit(stack, left, top, 0, 0, 175, 256); - int barX = left + 175 - 30; - int barY = top + 20; - int barWidth = 18; - int barHeight = 108; - screen.blit(stack, barX, barY, 175, barWidth, barWidth, barHeight); - - float pct = inv.getPressure() / inv.getCriticalPressure(); - GuiHelper.renderVerticallyFilledBar(stack, screen, barX, barY, 193, 18, barWidth, barHeight, pct); - - AbstractGui.drawCenteredString(stack, Minecraft.getInstance().fontRenderer, NumberFormat.getInstance().format(inv.getPressure()) + "P", left + 50, top + 80, 0xfefefe); - AbstractGui.drawCenteredString(stack, Minecraft.getInstance().fontRenderer, inv.getAir() + " Air", left + 50, top + 60, 0xfefefe); - - } - - - - @Override - public void tick(IMachinePortTile tile) { - this.inv.tick((TileEntity) tile); - } - - @Override - public void neighborChanged() { - airHandlerMap.clear(); - for (Direction side : DirectionUtil.VALUES) { - getLO().ifPresent(handler -> airHandlerMap.computeIfAbsent((IAirHandlerMachine) handler, k -> new ArrayList<>()).add(side)); - } - airHandlerMap.forEach(IAirHandlerMachine::setConnectedFaces); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/storage/PortStorage.java b/src/main/java/com/ticticboooom/mods/mm/ports/storage/PortStorage.java deleted file mode 100644 index 1c10258..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/storage/PortStorage.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.ticticboooom.mods.mm.ports.storage; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.ticticboooom.mods.mm.block.container.PortBlockContainer; -import com.ticticboooom.mods.mm.block.tile.IMachinePortTile; -import com.ticticboooom.mods.mm.block.tile.MachinePortBlockEntity; -import net.minecraft.block.BlockState; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.inventory.ContainerScreen; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.container.Container; -import net.minecraft.inventory.container.Slot; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.world.World; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.util.LazyOptional; - -public abstract class PortStorage { - public abstract LazyOptional getLO(); - public abstract boolean validate(Capability cap); - public abstract CompoundNBT save(CompoundNBT nbt); - public abstract void load(CompoundNBT nbt); - public abstract void render(MatrixStack stack, int mouseX, int mouseY, int left, int top, Screen screen); - public void setupContainer(PortBlockContainer container, PlayerInventory inv, IMachinePortTile tile) { - int playerOffsetX = 8; - int playerOffsetY = 141; - for (int j = 0; j < 3; j++) { - for (int i = 0; i < 9; i++) { - container.addSlot(new Slot(inv, 9 + (j * 9 + i), i* 18 + playerOffsetX, j* 18 + playerOffsetY)); - } - } - - for (int i = 0; i < 9; i++) { - container.addSlot(new Slot(inv, i,8 + (i * 18), 199)); - } - }; - - public void tick(IMachinePortTile tile) { - - } - - public void neighborChanged() { - - } - - public boolean onPortActivated(BlockState state, World level, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult traceResult) { - return false; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/storage/RotationPortStorage.java b/src/main/java/com/ticticboooom/mods/mm/ports/storage/RotationPortStorage.java deleted file mode 100644 index ee2a1e9..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/storage/RotationPortStorage.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.ticticboooom.mods.mm.ports.storage; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.simibubi.create.Create; -import com.simibubi.create.content.contraptions.KineticNetwork; -import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.tile.IMachinePortTile; -import com.ticticboooom.mods.mm.block.tile.MachinePortBlockEntity; -import lombok.Getter; -import lombok.Setter; -import me.desht.pneumaticcraft.api.PNCCapabilities; -import me.desht.pneumaticcraft.api.tileentity.IAirHandlerMachine; -import me.desht.pneumaticcraft.common.capabilities.MachineAirHandler; -import me.desht.pneumaticcraft.common.util.DirectionUtil; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.AbstractGui; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.util.LazyOptional; - -import java.text.NumberFormat; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class RotationPortStorage extends PortStorage { - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.INT.fieldOf("stress").forGetter(z -> z.stress) - ).apply(x, RotationPortStorage::new)); - @Getter - @Setter - private float speed; - - @Getter - private int stress; - - public RotationPortStorage(int stress) { - - this.stress = stress; - } - - private HashMap kinetics = new HashMap<>(); - public RotationPortStorage() { - } - - @Override - public LazyOptional getLO() { - return null; - } - - @Override - public boolean validate(Capability cap) { - return false; - } - - @Override - public CompoundNBT save(CompoundNBT nbt) { - nbt.putFloat("speed", speed); - return nbt; - } - - @Override - public void load(CompoundNBT nbt) { - speed = nbt.getFloat("speed"); - } - - @Override - public void render(MatrixStack stack, int mouseX, int mouseY, int left, int top, Screen screen) { - Minecraft.getInstance().textureManager.bindTexture(new ResourceLocation(MM.ID, "textures/gui/port_gui.png")); - screen.blit(stack, left, top, 0, 0, 175, 256); - AbstractGui.drawCenteredString(stack, Minecraft.getInstance().fontRenderer, speed + " Speed", left + 60, top + 30, 0xfefefe); - } - - @Override - public void tick(IMachinePortTile tile) { - this.speed = 0; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/storage/StarlightPortStorage.java b/src/main/java/com/ticticboooom/mods/mm/ports/storage/StarlightPortStorage.java deleted file mode 100644 index bbfb712..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/storage/StarlightPortStorage.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.ticticboooom.mods.mm.ports.storage; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.tile.MachinePortBlockEntity; -import com.ticticboooom.mods.mm.inventory.as.PortStarlightInventory; -import hellfirepvp.astralsorcery.common.block.base.BlockStarlightRecipient; -import hellfirepvp.astralsorcery.common.constellation.IWeakConstellation; -import lombok.Getter; -import lombok.Setter; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.AbstractGui; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.util.LazyOptional; - -import java.util.HashMap; -import java.util.Map; -import java.util.Random; - -public class StarlightPortStorage extends PortStorage { - public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.INT.fieldOf("capacity").forGetter(z -> z.getInv().getMaxStarlightStored()) - ).apply(x, StarlightPortStorage::new)); - - @Getter - private PortStarlightInventory inv; - - public StarlightPortStorage(int capacity) { - this.inv = new PortStarlightInventory(0, capacity); - } - - @Override - public LazyOptional getLO() { - return null; - } - - @Override - public boolean validate(Capability cap) { - return false; - } - - @Override - public CompoundNBT save(CompoundNBT nbt) { - nbt.putInt("starlight", inv.getStarlightStored()); - return nbt; - } - - @Override - public void load(CompoundNBT nbt) { - inv.setStored(nbt.getInt("starlight")); - } - - @Override - public void render(MatrixStack stack, int mouseX, int mouseY, int left, int top, Screen screen) { - Minecraft.getInstance().textureManager.bindTexture(new ResourceLocation(MM.ID, "textures/gui/port_gui.png")); - screen.blit(stack, left, top, 0, 0, 175, 256); - AbstractGui.drawCenteredString(stack, Minecraft.getInstance().fontRenderer, inv.getStarlightStored() + " Starlight", left + 60, top + 30, 0xfefefe); - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/storage/WeatherPortStorage.java b/src/main/java/com/ticticboooom/mods/mm/ports/storage/WeatherPortStorage.java deleted file mode 100644 index 2f08db8..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/ports/storage/WeatherPortStorage.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.ticticboooom.mods.mm.ports.storage; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.serialization.Codec; -import com.mojang.serialization.Decoder; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.ticticboooom.mods.mm.block.tile.IMachinePortTile; -import com.ticticboooom.mods.mm.ports.state.WeatherPortState; -import lombok.Getter; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraft.world.server.ServerWorld; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.util.LazyOptional; - -public class WeatherPortStorage extends PortStorage { - - @Getter - private boolean isRaining = false; - @Getter - private boolean isThundering = false; - - - @Override - public LazyOptional getLO() { - return null; - } - - @Override - public boolean validate(Capability cap) { - return false; - } - - @Override - public CompoundNBT save(CompoundNBT nbt) { - return new CompoundNBT(); - } - - @Override - public void load(CompoundNBT nbt) { - - } - - @Override - public void render(MatrixStack stack, int mouseX, int mouseY, int left, int top, Screen screen) { - - } - - @Override - public void tick(IMachinePortTile tile) { - TileEntity te = (TileEntity) tile; - World world = te.getWorld(); - if (world instanceof ServerWorld){ - ServerWorld sWorld = (ServerWorld) world; - isRaining = sWorld.getWorldInfo().isRaining(); - isThundering = sWorld.getWorldInfo().isThundering(); - } - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/registration/MMLoader.java b/src/main/java/com/ticticboooom/mods/mm/registration/MMLoader.java deleted file mode 100644 index 1d9777d..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/registration/MMLoader.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.ticticboooom.mods.mm.registration; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.ControllerBlock; -import com.ticticboooom.mods.mm.block.MachinePortBlock; -import com.ticticboooom.mods.mm.block.container.ControllerBlockContainer; -import com.ticticboooom.mods.mm.block.container.PortBlockContainer; -import com.ticticboooom.mods.mm.block.tile.ControllerBlockEntity; -import com.ticticboooom.mods.mm.helper.IOHelper; -import com.ticticboooom.mods.mm.helper.RLUtils; -import com.ticticboooom.mods.mm.ports.MasterfulPortType; -import com.ticticboooom.mods.mm.ports.storage.PortStorage; -import net.minecraft.inventory.container.ContainerType; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.common.extensions.IForgeContainerType; -import net.minecraftforge.fml.RegistryObject; -import net.minecraftforge.fml.loading.FMLPaths; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Supplier; - -public class MMLoader { - - public static final ItemGroup MASTERFUL_ITEM_GROUP = new ItemGroup(MM.ID) { - @Override - public ItemStack createIcon() { - return new ItemStack(MMSetup.BLUEPRINT.get()); - } - }; - - public static final ArrayList> BLOCKS = new ArrayList<>(); - public static final ArrayList> IPORT_BLOCKS = new ArrayList<>(); - public static final ArrayList> OPORT_BLOCKS = new ArrayList<>(); - public static final ArrayList>> CONTAINERS = new ArrayList<>(); - public static final ArrayList>> PORT_CONTAINERS = new ArrayList<>(); - - public static void load() { - Path rootPath = FMLPaths.CONFIGDIR.get().resolve("masterful_machinery"); - File rootFile = IOHelper.getFileAndCreate(rootPath); - - Path controllersPath = rootPath.resolve("controllers"); - File controllersFile = IOHelper.getFileAndCreate(controllersPath); - - List load = load(controllersFile); - - for (JsonObject obj : load) { - String controllerId = obj.get("controllerId").getAsString(); - String controllerName = obj.get("name").getAsString(); - String texOverride = null; - if (obj.has("textureOverride")) { - texOverride = obj.get("textureOverride").getAsString(); - } - final String textureOverrideFinal = texOverride; - { - Registerable>> controllerTile = new Registerable<>(); - Registerable> controllerBlock = new Registerable<>(); - Registerable>> cont = new Registerable<>(); - cont.set(MMSetup.CONTAINER_REG.register(controllerId + "_controller", () -> IForgeContainerType.create((i, o, u) -> new ControllerBlockContainer(cont.get().get(), i, o, u)))); - controllerBlock.set(MMSetup.BLOCKS_REG.register(controllerId + "_controller", () -> new ControllerBlock(controllerTile.get(), controllerName, controllerId, textureOverrideFinal))); - controllerTile.set(MMSetup.TILES_REG.register(controllerId + "_controller", () -> TileEntityType.Builder.create(() -> new ControllerBlockEntity(controllerTile.get(), cont.get(), controllerId), controllerBlock.get().get()).build(null))); - MMSetup.ITEMS_REG.register(controllerId + "_controller", () -> new BlockItem(controllerBlock.get().get(), new Item.Properties().group(MASTERFUL_ITEM_GROUP))); - BLOCKS.add(controllerBlock.get()); - CONTAINERS.add(cont.get()); - } - - JsonArray ports = obj.get("ports").getAsJsonArray(); - for (JsonElement port : ports) { - JsonObject portObj = port.getAsJsonObject(); - String type = portObj.get("type").getAsString(); - String id = portObj.get("id").getAsString(); - String name = portObj.get("name").getAsString(); - String portTexOverride = null; - if (portObj.has("textureOverride")){ - portTexOverride = portObj.get("textureOverride").getAsString(); - } else { - portTexOverride = textureOverrideFinal; - } - final String portTextureOverrideFinal = portTexOverride; - ResourceLocation resourceLocation = RLUtils.toRL(type); - MasterfulPortType value = MMPorts.PORTS.get(resourceLocation); - if (value == null){ - MM.LOG.warn("port type not present: " + resourceLocation.toString()); - continue; - } - Supplier data = value.getParser().createStorage(portObj.get("data").getAsJsonObject()); - - { - Registerable>> tile = new Registerable<>(); - Registerable> block = new Registerable<>(); - Registerable>> cont = new Registerable<>(); - cont.set(MMSetup.CONTAINER_REG.register(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_input", () -> IForgeContainerType.create((i, o, u) -> new PortBlockContainer(cont.get().get(), i, o, u)))); - block.set(value.getParser().registerBlock(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_input", MMSetup.BLOCKS_REG, tile, name, controllerId, portTextureOverrideFinal, value.getParser().getInputOverlay(), resourceLocation)); - tile.set(value.getParser().registerTileEntity(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_input", MMSetup.TILES_REG, tile, block, cont, data, true)); - MMSetup.ITEMS_REG.register(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_input", () -> new BlockItem(block.get().get(), new Item.Properties().group(MASTERFUL_ITEM_GROUP))); - PORT_CONTAINERS.add(cont.get()); - IPORT_BLOCKS.add(block.get()); - } - - { - Registerable>> tile = new Registerable<>(); - Registerable> block = new Registerable<>(); - Registerable>> cont = new Registerable<>(); - cont.set(MMSetup.CONTAINER_REG.register(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_output", () -> IForgeContainerType.create((i, o, u) -> new PortBlockContainer(cont.get().get(), i, o, u)))); - block.set(value.getParser().registerBlock(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_output", MMSetup.BLOCKS_REG, tile, name, controllerId, portTextureOverrideFinal, value.getParser().getOutputOverlay(), resourceLocation)); - tile.set(value.getParser().registerTileEntity(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_output", MMSetup.TILES_REG, tile, block, cont, data, false)); - MMSetup.ITEMS_REG.register(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_output", () -> new BlockItem(block.get().get(), new Item.Properties().group(MASTERFUL_ITEM_GROUP))); - PORT_CONTAINERS.add(cont.get()); - OPORT_BLOCKS.add(block.get()); - } - - } - - MM.LOG.debug("Registered controller with id '{}'", controllerId); - } - } - - private static List load(File file) { - if (!file.exists()) { - MM.LOG.fatal("file non existent upon reading, where TF has it gone between listing and reading hm Hm HMMMMM?!?!?!?!?!"); - return new ArrayList<>(); - } - ArrayList result = new ArrayList(); - File[] list = file.listFiles(); - - if (list == null) { - return result; - } - - for (File s : list) { - if (!s.exists()) { - MM.LOG.fatal("file non existent upon reading, where TF has it gone between listing and reading hm Hm HMMMMM?!?!?!?!?!"); - continue; - } - try { - FileReader fr = new FileReader(s); - JsonElement json = new JsonParser().parse(fr); - result.add(json.getAsJsonObject()); - } catch (FileNotFoundException e) { - e.printStackTrace(); - MM.LOG.fatal("Failed to read or parse file: {}", file.getAbsolutePath()); - } - } - return result; - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/registration/MMPorts.java b/src/main/java/com/ticticboooom/mods/mm/registration/MMPorts.java deleted file mode 100644 index e23210d..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/registration/MMPorts.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.ticticboooom.mods.mm.registration; - -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.ports.MasterfulPortType; -import com.ticticboooom.mods.mm.ports.parser.*; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.ModList; - -import java.util.HashMap; -import java.util.Map; - -public class MMPorts { - public static Map PORTS = new HashMap<>(); - - public static void init() { - PORTS.put(new ResourceLocation(MM.ID, "items"), new MasterfulPortType(new ResourceLocation(MM.ID, "items"), new ItemPortParser())); - PORTS.put(new ResourceLocation(MM.ID, "fluids"), new MasterfulPortType(new ResourceLocation(MM.ID, "fluids"), new FluidPortParser())); - PORTS.put(new ResourceLocation(MM.ID, "energy"),new MasterfulPortType(new ResourceLocation(MM.ID, "energy"), new EnergyPortParser())); -// PORTS.put(new ResourceLocation(MM.ID, "weather"),new MasterfulPortType(new ResourceLocation(MM.ID, "weather"), new WeatherPortParser())); - if (ModList.get().isLoaded("mekanism")) { - PORTS.put(new ResourceLocation(MM.ID, "mekanism_gas"),new MasterfulPortType(new ResourceLocation(MM.ID, "mekanism_gas"), new MekGasPortParser())); - PORTS.put(new ResourceLocation(MM.ID, "mekanism_slurry"),new MasterfulPortType(new ResourceLocation(MM.ID, "mekanism_slurry"), new MekSlurryPortParser())); - PORTS.put(new ResourceLocation(MM.ID, "mekanism_infuse"),new MasterfulPortType(new ResourceLocation(MM.ID, "mekanism_infuse"), new MekInfusePortParser())); - } - if (ModList.get().isLoaded("pneumaticcraft")){ - PORTS.put(new ResourceLocation(MM.ID, "pncr_pressure"),new MasterfulPortType(new ResourceLocation(MM.ID, "pncr_pressure"), new PneumaticPortParser())); - } - if (ModList.get().isLoaded("create")){ - PORTS.put(new ResourceLocation(MM.ID, "create_rotation"),new MasterfulPortType(new ResourceLocation(MM.ID, "create_rotation"), new RotationPortParser())); - } - if (ModList.get().isLoaded("botania")){ - PORTS.put(new ResourceLocation(MM.ID, "botania_mana"),new MasterfulPortType(new ResourceLocation(MM.ID, "botania_mana"), new ManaPortParser())); - } - if (ModList.get().isLoaded("astralsorcery")){ - PORTS.put(new ResourceLocation(MM.ID, "astral_starlight"),new MasterfulPortType(new ResourceLocation(MM.ID, "astral_starlight"), new StarlightPortParser())); - } - } -} diff --git a/src/main/java/com/ticticboooom/mods/mm/registration/MMSetup.java b/src/main/java/com/ticticboooom/mods/mm/registration/MMSetup.java deleted file mode 100644 index 0bece93..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/registration/MMSetup.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.ticticboooom.mods.mm.registration; - -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.block.ProjectorBlock; -import com.ticticboooom.mods.mm.block.StructureGenBlock; -import com.ticticboooom.mods.mm.block.container.ProjectorBlockContainer; -import com.ticticboooom.mods.mm.block.container.StructureGenBlockContainer; -import com.ticticboooom.mods.mm.block.tile.ProjectorBlockEntity; -import com.ticticboooom.mods.mm.block.tile.StructureGenBlockEntity; -import com.ticticboooom.mods.mm.item.StructureGenSelectionDevice; -import net.minecraft.block.Block; -import net.minecraft.inventory.container.ContainerType; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; -import net.minecraft.tileentity.TileEntityType; -import net.minecraftforge.common.extensions.IForgeContainerType; -import net.minecraftforge.fml.RegistryObject; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; - -public class MMSetup { - - public static final DeferredRegister BLOCKS_REG = DeferredRegister.create(ForgeRegistries.BLOCKS, MM.ID); - public static final DeferredRegister ITEMS_REG = DeferredRegister.create(ForgeRegistries.ITEMS, MM.ID); - public static final DeferredRegister> TILES_REG = DeferredRegister.create(ForgeRegistries.TILE_ENTITIES, MM.ID); - public static final DeferredRegister> CONTAINER_REG = DeferredRegister.create(ForgeRegistries.CONTAINERS, MM.ID); - - public static final RegistryObject BLUEPRINT = ITEMS_REG.register("blueprint", () -> new Item(new Item.Properties().group(MMLoader.MASTERFUL_ITEM_GROUP))); - - public static final RegistryObject> PROJECTOR_TILE = TILES_REG.register("projector", () -> TileEntityType.Builder.create(ProjectorBlockEntity::new).build(null)); - public static final RegistryObject PROJECTOR_BLOCK = BLOCKS_REG.register("projector", ProjectorBlock::new); - public static final RegistryObject> PROJECTOR_CONTAINER = CONTAINER_REG.register("projector", () -> IForgeContainerType.create(ProjectorBlockContainer::new)); - public static final RegistryObject PROJECTOR_ITEM = ITEMS_REG.register("projector", () -> new BlockItem(PROJECTOR_BLOCK.get(), new Item.Properties().group(MMLoader.MASTERFUL_ITEM_GROUP))); - - - public static final RegistryObject STRUCTURE_BLOCK = BLOCKS_REG.register("structure_generator", StructureGenBlock::new); - public static final RegistryObject> STRUCTURE_TILE = TILES_REG.register("structure_generator", () -> TileEntityType.Builder.create(StructureGenBlockEntity::new, STRUCTURE_BLOCK.get()).build(null)); - public static final RegistryObject> STRUCTURE_CONTAINER = CONTAINER_REG.register("structure_generator", () -> IForgeContainerType.create(StructureGenBlockContainer::new)); - public static final RegistryObject STRUCTURE_ITEM = ITEMS_REG.register("structure_generator", () -> new BlockItem(STRUCTURE_BLOCK.get(), new Item.Properties().group(MMLoader.MASTERFUL_ITEM_GROUP))); - public static final RegistryObject STRUCTURE_DEVICE = ITEMS_REG.register("structure_gen_device", StructureGenSelectionDevice::new); -} diff --git a/src/main/java/com/ticticboooom/mods/mm/registration/RecipeTypes.java b/src/main/java/com/ticticboooom/mods/mm/registration/RecipeTypes.java deleted file mode 100644 index a549378..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/registration/RecipeTypes.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.ticticboooom.mods.mm.registration; - -import com.ticticboooom.mods.mm.MM; -import com.ticticboooom.mods.mm.data.MachineProcessRecipe; -import com.ticticboooom.mods.mm.data.MachineStructureRecipe; -import net.minecraft.item.crafting.IRecipeSerializer; -import net.minecraft.item.crafting.IRecipeType; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.RegistryObject; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; - -public class RecipeTypes { - public static final DeferredRegister> RECIPE_SERIALIZERS = DeferredRegister.create(ForgeRegistries.RECIPE_SERIALIZERS, MM.ID); - public static final IRecipeType MACHINE_STRUCTURE = IRecipeType.register("machine_structure"); - public static final IRecipeType MACHINE_PROCESS = IRecipeType.register("machine_process"); - - public static final RegistryObject STRUCTURE = RECIPE_SERIALIZERS.register("machine_structure", MachineStructureRecipe.Serializer::new); - public static final RegistryObject PROCESS = RECIPE_SERIALIZERS.register("machine_process", MachineProcessRecipe.Serializer::new); -} diff --git a/src/main/java/com/ticticboooom/mods/mm/registration/Registerable.java b/src/main/java/com/ticticboooom/mods/mm/registration/Registerable.java deleted file mode 100644 index 906b360..0000000 --- a/src/main/java/com/ticticboooom/mods/mm/registration/Registerable.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.ticticboooom.mods.mm.registration; - -public class Registerable { - private T inner; - public Registerable(){ - - } - - public void set(T inner) { - this.inner = inner; - } - - public T get() { - return inner; - } -} diff --git a/src/main/java/live/ticticboooom/mods/masterfulmachinery/ModRoot.java b/src/main/java/live/ticticboooom/mods/masterfulmachinery/ModRoot.java new file mode 100644 index 0000000..93e42c0 --- /dev/null +++ b/src/main/java/live/ticticboooom/mods/masterfulmachinery/ModRoot.java @@ -0,0 +1,7 @@ +package live.ticticboooom.mods.masterfulmachinery; + +import net.minecraftforge.fml.common.Mod; + +@Mod(Ref.MOD_ID) +public class ModRoot { +} diff --git a/src/main/java/live/ticticboooom/mods/masterfulmachinery/Ref.java b/src/main/java/live/ticticboooom/mods/masterfulmachinery/Ref.java new file mode 100644 index 0000000..c9b6f2b --- /dev/null +++ b/src/main/java/live/ticticboooom/mods/masterfulmachinery/Ref.java @@ -0,0 +1,14 @@ +package live.ticticboooom.mods.masterfulmachinery; + +import net.minecraft.resources.ResourceLocation; + +public class Ref { + public static final String MOD_ID = "masterfulmachinery"; + public static ResourceLocation res(String path) { + return new ResourceLocation(MOD_ID, path); + } + + public static final class Ports { + public static final ResourceLocation ITEMS = res("items"); + } +} diff --git a/src/main/java/live/ticticboooom/mods/masterfulmachinery/block/MasterfulPortBlock.java b/src/main/java/live/ticticboooom/mods/masterfulmachinery/block/MasterfulPortBlock.java new file mode 100644 index 0000000..476c9dd --- /dev/null +++ b/src/main/java/live/ticticboooom/mods/masterfulmachinery/block/MasterfulPortBlock.java @@ -0,0 +1,11 @@ +package live.ticticboooom.mods.masterfulmachinery.block; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.material.Material; + +public class MasterfulPortBlock extends Block { + public MasterfulPortBlock() { + super(Properties.of(Material.METAL).strength(5.0f, 5.0f)); + + } +} diff --git a/src/main/java/live/ticticboooom/mods/masterfulmachinery/block/entity/MasterfulPortBlockEntity.java b/src/main/java/live/ticticboooom/mods/masterfulmachinery/block/entity/MasterfulPortBlockEntity.java new file mode 100644 index 0000000..6d184c5 --- /dev/null +++ b/src/main/java/live/ticticboooom/mods/masterfulmachinery/block/entity/MasterfulPortBlockEntity.java @@ -0,0 +1,13 @@ +package live.ticticboooom.mods.masterfulmachinery.block.entity; + +import live.ticticboooom.mods.masterfulmachinery.ports.base.MasterfulPortType; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +public class MasterfulPortBlockEntity extends BlockEntity { + public MasterfulPortBlockEntity(BlockPos p_155229_, BlockState p_155230_) { + super(MasterfulPortType.DEFAULT_BLOCK_ENTITY.get(), p_155229_, p_155230_); + } +} diff --git a/src/main/java/live/ticticboooom/mods/masterfulmachinery/ports/base/MasterfulPortType.java b/src/main/java/live/ticticboooom/mods/masterfulmachinery/ports/base/MasterfulPortType.java new file mode 100644 index 0000000..622723a --- /dev/null +++ b/src/main/java/live/ticticboooom/mods/masterfulmachinery/ports/base/MasterfulPortType.java @@ -0,0 +1,24 @@ +package live.ticticboooom.mods.masterfulmachinery.ports.base; + +import live.ticticboooom.mods.masterfulmachinery.block.MasterfulPortBlock; +import live.ticticboooom.mods.masterfulmachinery.block.entity.MasterfulPortBlockEntity; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraftforge.common.util.Lazy; +import net.minecraftforge.registries.ForgeRegistryEntry; +import net.minecraftforge.registries.RegistryObject; + +public class MasterfulPortType extends ForgeRegistryEntry { + public static final Lazy DEFAULT_BLOCK = Lazy.of(MasterfulPortBlock::new); + public static final Lazy> DEFAULT_BLOCK_ENTITY = Lazy.of(() -> BlockEntityType.Builder.of(MasterfulPortBlockEntity::new, DEFAULT_BLOCK.get()).build(null)); + + public BlockEntityType blockEntityType() { + return DEFAULT_BLOCK_ENTITY.get(); + } + + public Block block() { + return DEFAULT_BLOCK.get(); + } + +} diff --git a/src/main/java/live/ticticboooom/mods/masterfulmachinery/ports/types/ItemsPortType.java b/src/main/java/live/ticticboooom/mods/masterfulmachinery/ports/types/ItemsPortType.java new file mode 100644 index 0000000..ff601f5 --- /dev/null +++ b/src/main/java/live/ticticboooom/mods/masterfulmachinery/ports/types/ItemsPortType.java @@ -0,0 +1,7 @@ +package live.ticticboooom.mods.masterfulmachinery.ports.types; + +import live.ticticboooom.mods.masterfulmachinery.ports.base.MasterfulPortType; + +public class ItemsPortType extends MasterfulPortType { + +} diff --git a/src/main/java/live/ticticboooom/mods/masterfulmachinery/registry/Registries.java b/src/main/java/live/ticticboooom/mods/masterfulmachinery/registry/Registries.java new file mode 100644 index 0000000..8e6625f --- /dev/null +++ b/src/main/java/live/ticticboooom/mods/masterfulmachinery/registry/Registries.java @@ -0,0 +1,23 @@ +package live.ticticboooom.mods.masterfulmachinery.registry; + +import live.ticticboooom.mods.masterfulmachinery.Ref; +import live.ticticboooom.mods.masterfulmachinery.ports.base.MasterfulPortType; +import live.ticticboooom.mods.masterfulmachinery.ports.types.ItemsPortType; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.registries.IForgeRegistry; +import net.minecraftforge.registries.RegistryBuilder; + +import java.util.HashMap; +import java.util.Map; + +public class Registries { + + public static Map PORTS = new HashMap<>(); + + public static void registerPort() { + PORTS.put(Ref.Ports.ITEMS, new ItemsPortType()); + } +} diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index a6156f6..16bd38a 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -6,7 +6,7 @@ # The name of the mod loader type to load - for regular FML @Mod mods it should be javafml modLoader="javafml" #mandatory # A version range to match for said mod loader - for regular FML @Mod it will be the forge version -loaderVersion="[36,)" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions. +loaderVersion="[38,)" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions. # The license for you mod. This is mandatory metadata and allows for easier comprehension of your redistributive properties. # Review your options at https://choosealicense.com/. All rights reserved is the default copyright stance, and is thus the default here. license="All rights reserved" @@ -21,7 +21,7 @@ modId="masterfulmachinery" #mandatory # see the associated build.gradle script for how to populate this completely automatically during a build version="${file.jarVersion}" #mandatory # A display name for the mod -displayName="Masterful Machinery" #mandatory +displayName="Example Mod" #mandatory # A URL to query for updates for this mod. See the JSON update specification https://mcforge.readthedocs.io/en/latest/gettingstarted/autoupdate/ #updateJSONURL="https://change.me.example.invalid/updates.json" #optional # A URL for the "homepage" for this mod, displayed in the mod UI @@ -47,7 +47,7 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed mollis lacinia magn # Does this dependency have to exist - if not, ordering below must be specified mandatory=true #mandatory # The version range of the dependency - versionRange="[36,)" #mandatory + versionRange="[38,)" #mandatory # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory ordering="NONE" # Side this dependency is applied on - BOTH, CLIENT or SERVER @@ -57,6 +57,6 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed mollis lacinia magn modId="minecraft" mandatory=true # This version range declares a minimum of the current minecraft version up to but not including the next major version - versionRange="[1.16.5,1.17)" + versionRange="[1.18,1.19)" ordering="NONE" side="BOTH" diff --git a/src/main/resources/assets/masterfulmachinery/models/block/projector.json b/src/main/resources/assets/masterfulmachinery/models/block/projector.json deleted file mode 100644 index c56616b..0000000 --- a/src/main/resources/assets/masterfulmachinery/models/block/projector.json +++ /dev/null @@ -1,332 +0,0 @@ -{ - "credit": "Made with Blockbench", - "texture_size": [32, 32], - "textures": { - "particle": "masterfulmachinery:block/projector", - "base": "masterfulmachinery:block/projector" - }, - "elements": [ - { - "from": [4, 2, 4], - "to": [12, 3, 12], - "faces": { - "north": {"uv": [0, 3.5, 4, 4], "texture": "#base"}, - "east": {"uv": [0, 0, 0.5, 4], "rotation": 270, "texture": "#base"}, - "south": {"uv": [0, 0, 4, 0.5], "rotation": 180, "texture": "#base"}, - "west": {"uv": [3.5, 0, 4, 4], "rotation": 90, "texture": "#base"}, - "up": {"uv": [0, 0, 4, 4], "rotation": 180, "texture": "#base"}, - "down": {"uv": [4, 0, 0, 4], "texture": "#base"} - } - }, - { - "from": [4, 0, 4], - "to": [12, 1, 12], - "faces": { - "north": {"uv": [0, 3.5, 4, 4], "texture": "#base"}, - "east": {"uv": [0, 0, 0.5, 4], "rotation": 270, "texture": "#base"}, - "south": {"uv": [0, 0, 4, 0.5], "rotation": 180, "texture": "#base"}, - "west": {"uv": [3.5, 0, 4, 4], "rotation": 90, "texture": "#base"}, - "up": {"uv": [0, 0, 4, 4], "rotation": 180, "texture": "#base"}, - "down": {"uv": [4, 0, 0, 4], "texture": "#base"} - } - }, - { - "from": [6, 2.5, 6], - "to": [10, 3.5, 10], - "faces": { - "north": {"uv": [1, 1, 3, 1.5], "rotation": 180, "texture": "#base"}, - "east": {"uv": [2.5, 1, 3, 3], "rotation": 90, "texture": "#base"}, - "south": {"uv": [1, 2.5, 3, 3], "rotation": 180, "texture": "#base"}, - "west": {"uv": [1, 1, 1.5, 3], "rotation": 270, "texture": "#base"}, - "up": {"uv": [1, 1, 3, 3], "texture": "#base"}, - "down": {"uv": [0, 0, 2, 2], "texture": "#base"} - } - }, - { - "from": [5, 1, 5], - "to": [11, 2, 11], - "faces": { - "north": {"uv": [0.5, 0, 3.5, 0.5], "texture": "#base"}, - "east": {"uv": [0, 0.5, 0.5, 3.5], "rotation": 90, "texture": "#base"}, - "south": {"uv": [0.5, 3.5, 3.5, 4], "texture": "#base"}, - "west": {"uv": [3.5, 0.5, 4, 3.5], "rotation": 270, "texture": "#base"}, - "up": {"uv": [0, 0, 3, 3], "texture": "#base"}, - "down": {"uv": [0, 0, 3, 3], "texture": "#base"} - } - }, - { - "from": [1.5, 0.5, 6], - "to": [7.5, 1.5, 10], - "rotation": {"angle": -22.5, "axis": "z", "origin": [8, 3.5, 8]}, - "faces": { - "north": {"uv": [0, 5.5, 3, 6], "texture": "#base"}, - "east": {"uv": [4, 0, 6, 0.5], "texture": "#base"}, - "south": {"uv": [0, 4, 3, 4.5], "rotation": 180, "texture": "#base"}, - "west": {"uv": [2.5, 4, 3, 6], "rotation": 90, "texture": "#base"}, - "up": {"uv": [0, 4, 3, 6], "rotation": 180, "texture": "#base"}, - "down": {"uv": [3, 4, 6, 6], "rotation": 180, "texture": "#base"} - } - }, - { - "from": [1, 3.5, 7], - "to": [2, 7.75, 9], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 3.5, 8]}, - "faces": { - "north": {"uv": [0, 9, 2, 9.5], "rotation": 90, "texture": "#base"}, - "east": {"uv": [0, 9, 2, 10], "rotation": 90, "texture": "#base"}, - "south": {"uv": [0, 9.5, 2, 10], "rotation": 90, "texture": "#base"}, - "west": {"uv": [2, 9, 0, 10], "rotation": 270, "texture": "#base"}, - "up": {"uv": [0, 9, 0.5, 10], "texture": "#base"}, - "down": {"uv": [1.5, 9, 2, 10], "texture": "#base"} - } - }, - { - "from": [14, 3.5, 7], - "to": [15, 7.75, 9], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 3.5, 8]}, - "faces": { - "north": {"uv": [0, 9, 2, 9.5], "rotation": 90, "texture": "#base"}, - "east": {"uv": [0, 9, 2, 10], "rotation": 90, "texture": "#base"}, - "south": {"uv": [0, 9.5, 2, 10], "rotation": 90, "texture": "#base"}, - "west": {"uv": [2, 9, 0, 10], "rotation": 270, "texture": "#base"}, - "up": {"uv": [0, 9, 0.5, 10], "texture": "#base"}, - "down": {"uv": [1.5, 9, 2, 10], "texture": "#base"} - } - }, - { - "from": [13.75, 6.25, 7.5], - "to": [14.75, 7.25, 8.5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 3.5, 8]}, - "faces": { - "north": {"uv": [0, 10, 0.5, 10.5], "rotation": 90, "texture": "#base"}, - "east": {"uv": [0, 10, 2, 12], "rotation": 90, "texture": "#base"}, - "south": {"uv": [0, 10, 0.5, 10.5], "rotation": 90, "texture": "#base"}, - "west": {"uv": [0, 10, 2, 12], "rotation": 90, "texture": "#base"}, - "up": {"uv": [0, 10, 0.5, 10.5], "rotation": 90, "texture": "#base"}, - "down": {"uv": [0, 10, 0.5, 10.5], "rotation": 90, "texture": "#base"} - } - }, - { - "from": [1.25, 6.25, 7.5], - "to": [2.25, 7.25, 8.5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 3.5, 8]}, - "faces": { - "north": {"uv": [0, 10, 0.5, 10.5], "rotation": 90, "texture": "#base"}, - "east": {"uv": [0, 10, 2, 12], "rotation": 90, "texture": "#base"}, - "south": {"uv": [0, 10, 0.5, 10.5], "rotation": 90, "texture": "#base"}, - "west": {"uv": [0, 10, 2, 12], "rotation": 90, "texture": "#base"}, - "up": {"uv": [0, 10, 0.5, 10.5], "rotation": 90, "texture": "#base"}, - "down": {"uv": [0, 10, 0.5, 10.5], "rotation": 90, "texture": "#base"} - } - }, - { - "from": [6, 0.5, 8.5], - "to": [10, 1.5, 14.5], - "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 3.5, 8]}, - "faces": { - "north": {"uv": [4, 0, 6, 0.5], "texture": "#base"}, - "east": {"uv": [0, 4, 3, 4.5], "rotation": 180, "texture": "#base"}, - "south": {"uv": [2.5, 4, 3, 6], "rotation": 90, "texture": "#base"}, - "west": {"uv": [0, 5.5, 3, 6], "texture": "#base"}, - "up": {"uv": [0, 4, 3, 6], "rotation": 90, "texture": "#base"}, - "down": {"uv": [3, 4, 6, 6], "rotation": 270, "texture": "#base"} - } - }, - { - "from": [6, 14.5, 8.5], - "to": [10, 15.5, 14.5], - "rotation": {"angle": 22.5, "axis": "x", "origin": [8, 12.5, 8]}, - "faces": { - "north": {"uv": [0, 7, 0.5, 9], "rotation": 270, "texture": "#base"}, - "east": {"uv": [0, 7.5, 3, 7], "rotation": 180, "texture": "#base"}, - "south": {"uv": [3, 7, 2.5, 9], "rotation": 90, "texture": "#base"}, - "west": {"uv": [0, 9, 3, 8.5], "texture": "#base"}, - "up": {"uv": [0, 7, 3, 9], "rotation": 90, "texture": "#base"}, - "down": {"uv": [3, 7, 6, 9], "rotation": 90, "texture": "#base"} - } - }, - { - "from": [7, 14.25, 9.5], - "to": [9, 15.25, 11.5], - "rotation": {"angle": 22.5, "axis": "x", "origin": [8, 12.5, 8]}, - "faces": { - "north": {"uv": [0, 10, 0.5, 10.5], "texture": "#base"}, - "east": {"uv": [0, 10, 0.5, 10.5], "texture": "#base"}, - "south": {"uv": [0, 10, 0.5, 10.5], "texture": "#base"}, - "west": {"uv": [0, 10, 0.5, 10.5], "texture": "#base"}, - "up": {"uv": [0, 10, 0.5, 10.5], "texture": "#base"}, - "down": {"uv": [0, 10, 2, 12], "rotation": 270, "texture": "#base"} - } - }, - { - "from": [9, 3.5, 14], - "to": [10, 12.75, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 3.5, 8]}, - "faces": { - "north": {"uv": [0, 12.5, 4.625, 13], "rotation": 90, "texture": "#base"}, - "east": {"uv": [0, 12.5, 4.625, 13], "rotation": 90, "texture": "#base"}, - "south": {"uv": [0, 12.5, 4.625, 13], "rotation": 90, "texture": "#base"}, - "west": {"uv": [0, 12.5, 4.625, 13], "rotation": 90, "texture": "#base"}, - "up": {"uv": [0, 0, 0.5, 0.5], "rotation": 180, "texture": "#missing"}, - "down": {"uv": [0, 1, 0.5, 1.5], "texture": "#missing"} - } - }, - { - "from": [8.75, 2.5, 13.75], - "to": [10.25, 4.75, 15.25], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 3.5, 8]}, - "faces": { - "north": {"uv": [0, 6.5, 1, 7], "rotation": 270, "texture": "#base"}, - "east": {"uv": [0, 6.5, 1, 7], "rotation": 270, "texture": "#base"}, - "south": {"uv": [0, 6.5, 1, 7], "rotation": 270, "texture": "#base"}, - "west": {"uv": [0, 6.5, 1, 7], "rotation": 270, "texture": "#base"}, - "up": {"uv": [0.5, 6.5, 1, 7], "rotation": 270, "texture": "#base"}, - "down": {"uv": [0, 6.5, 0.5, 7], "rotation": 270, "texture": "#base"} - } - }, - { - "from": [8.75, 11.25, 13.75], - "to": [10.25, 13.5, 15.25], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 12.5, 8]}, - "faces": { - "north": {"uv": [1, 6.5, 0, 7], "rotation": 270, "texture": "#base"}, - "east": {"uv": [1, 6.5, 0, 7], "rotation": 270, "texture": "#base"}, - "south": {"uv": [1, 6.5, 0, 7], "rotation": 270, "texture": "#base"}, - "west": {"uv": [1, 6.5, 0, 7], "rotation": 270, "texture": "#base"}, - "up": {"uv": [0.5, 6.5, 0, 7], "rotation": 270, "texture": "#base"}, - "down": {"uv": [1, 6.5, 0.5, 7], "rotation": 270, "texture": "#base"} - } - }, - { - "from": [5.75, 2.5, 13.75], - "to": [7.25, 4.75, 15.25], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 3.5, 8]}, - "faces": { - "north": {"uv": [0, 6.5, 1, 7], "rotation": 270, "texture": "#base"}, - "east": {"uv": [0, 6.5, 1, 7], "rotation": 270, "texture": "#base"}, - "south": {"uv": [0, 6.5, 1, 7], "rotation": 270, "texture": "#base"}, - "west": {"uv": [0, 6.5, 1, 7], "rotation": 270, "texture": "#base"}, - "up": {"uv": [0.5, 6.5, 1, 7], "rotation": 270, "texture": "#base"}, - "down": {"uv": [0, 6.5, 0.5, 7], "rotation": 270, "texture": "#base"} - } - }, - { - "from": [5.75, 11.25, 13.75], - "to": [7.25, 13.5, 15.25], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 12.5, 8]}, - "faces": { - "north": {"uv": [1, 6.5, 0, 7], "rotation": 270, "texture": "#base"}, - "east": {"uv": [1, 6.5, 0, 7], "rotation": 270, "texture": "#base"}, - "south": {"uv": [1, 6.5, 0, 7], "rotation": 270, "texture": "#base"}, - "west": {"uv": [1, 6.5, 0, 7], "rotation": 270, "texture": "#base"}, - "up": {"uv": [0.5, 6.5, 0, 7], "rotation": 270, "texture": "#base"}, - "down": {"uv": [1, 6.5, 0.5, 7], "rotation": 270, "texture": "#base"} - } - }, - { - "from": [6, 3.5, 14], - "to": [7, 12.75, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 3.5, 8]}, - "faces": { - "north": {"uv": [0, 12, 4.625, 12.5], "rotation": 90, "texture": "#base"}, - "east": {"uv": [0, 12, 4.625, 12.5], "rotation": 90, "texture": "#base"}, - "south": {"uv": [0, 12, 4.625, 12.5], "rotation": 90, "texture": "#base"}, - "west": {"uv": [0, 12, 4.625, 12.5], "rotation": 90, "texture": "#base"}, - "up": {"uv": [0, 0, 0.5, 0.5], "rotation": 180, "texture": "#base"}, - "down": {"uv": [0, 1, 0.5, 1.5], "texture": "#base"} - } - }, - { - "from": [8.5, 0.5, 6], - "to": [14.5, 1.5, 10], - "rotation": {"angle": 22.5, "axis": "z", "origin": [8, 3.5, 8]}, - "faces": { - "north": {"uv": [0, 4, 3, 4.5], "rotation": 180, "texture": "#base"}, - "east": {"uv": [2.5, 4, 3, 6], "rotation": 90, "texture": "#base"}, - "south": {"uv": [0, 5.5, 3, 6], "texture": "#base"}, - "west": {"uv": [0, 0, 2, 0.5], "texture": "#base"}, - "up": {"uv": [0, 4, 3, 6], "texture": "#base"}, - "down": {"uv": [3, 4, 6, 6], "texture": "#base"} - } - }, - { - "from": [13.75, 2.5, 6.75], - "to": [15.25, 4.75, 9.25], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 3.5, 8]}, - "faces": { - "north": {"uv": [0, 6.5, 1, 7], "rotation": 270, "texture": "#base"}, - "east": {"uv": [0, 6, 1, 7], "rotation": 270, "texture": "#base"}, - "south": {"uv": [0, 6.5, 1, 7], "rotation": 270, "texture": "#base"}, - "west": {"uv": [0, 6, 1, 7], "rotation": 270, "texture": "#base"}, - "up": {"uv": [0.5, 6, 1, 7], "rotation": 180, "texture": "#base"}, - "down": {"uv": [0, 6, 0.5, 7], "rotation": 180, "texture": "#base"} - } - }, - { - "from": [0.75, 2.5, 6.75], - "to": [2.25, 4.75, 9.25], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 3.5, 8]}, - "faces": { - "north": {"uv": [0, 6.5, 1, 7], "rotation": 270, "texture": "#base"}, - "east": {"uv": [0, 6, 1, 7], "rotation": 270, "texture": "#base"}, - "south": {"uv": [0, 6.5, 1, 7], "rotation": 270, "texture": "#base"}, - "west": {"uv": [0, 6, 1, 7], "rotation": 270, "texture": "#base"}, - "up": {"uv": [0.5, 6, 1, 7], "rotation": 180, "texture": "#base"}, - "down": {"uv": [0, 6, 0.5, 7], "rotation": 180, "texture": "#base"} - } - }, - { - "from": [5, 6, 5], - "to": [11, 12, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 8]}, - "faces": { - "north": {"uv": [9.5, 9.5, 16, 16], "texture": "#base"}, - "east": {"uv": [16, 9.5, 9.5, 16], "texture": "#base"}, - "south": {"uv": [9.5, 9.5, 16, 16], "texture": "#base"}, - "west": {"uv": [16, 9.5, 9.5, 16], "texture": "#base"}, - "up": {"uv": [9.5, 3, 16, 9.5], "texture": "#base"}, - "down": {"uv": [16, 3, 9.5, 9.5], "texture": "#base"} - } - } - ], - "display": { - "thirdperson_righthand": { - "rotation": [75, 45, 0], - "translation": [-2.25, 2, 0], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, 45, 0], - "translation": [-2.25, 2, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 135, 0], - "scale": [0.4, 0.4, 0.4] - }, - "firstperson_lefthand": { - "rotation": [0, 135, 0], - "scale": [0.4, 0.4, 0.4] - }, - "ground": { - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "gui": { - "rotation": [30, 225, 0], - "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "rotation": [-90, 0, 0], - "translation": [0, 0, -4], - "scale": [0.5, 0.5, 0.5] - } - }, - "groups": [0, 1, 2, 3, - { - "name": "group", - "origin": [8, 3.58153, 8], - "children": [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/masterfulmachinery/models/block/structure_generator.json b/src/main/resources/assets/masterfulmachinery/models/block/structure_generator.json deleted file mode 100644 index 7545116..0000000 --- a/src/main/resources/assets/masterfulmachinery/models/block/structure_generator.json +++ /dev/null @@ -1,351 +0,0 @@ -{ - "credit": "Made with Blockbench", - "texture_size": [32, 32], - "textures": { - "base": "masterfulmachinery:block/config_generator_base", - "particle": "masterfulmachinery:block/config_generator_monitor", - "monitor": "masterfulmachinery:block/config_generator_monitor" - }, - "elements": [ - { - "from": [0, 0, 0], - "to": [16, 2, 16], - "faces": { - "north": {"uv": [8, 10, 16, 11], "texture": "#base"}, - "east": {"uv": [8, 7, 16, 8], "texture": "#base"}, - "south": {"uv": [8, 9, 16, 10], "texture": "#base"}, - "west": {"uv": [8, 8, 16, 9], "texture": "#base"}, - "up": {"uv": [0, 0, 8, 8], "texture": "#base"}, - "down": {"uv": [0, 8, 8, 16], "texture": "#base"} - } - }, - { - "from": [1, 0.75, 1], - "to": [15, 1.75, 8], - "rotation": {"angle": -22.5, "axis": "x", "origin": [0, -0.25, 1]}, - "faces": { - "north": {"uv": [0, 0, 7, 0.5], "texture": "#base"}, - "east": {"uv": [0.5, 4.5, 4, 5], "texture": "#base"}, - "south": {"uv": [0, 0, 7, 0.5], "texture": "#base"}, - "west": {"uv": [4, 4.5, 7.5, 5], "texture": "#base"}, - "up": {"uv": [0.5, 1, 7.5, 4.5], "texture": "#base"}, - "down": {"uv": [0, 0, 7, 3.5], "texture": "#base"} - } - }, - { - "from": [5, 1, 3], - "to": [14, 2, 6], - "rotation": {"angle": -22.5, "axis": "x", "origin": [0, -0.25, 1]}, - "faces": { - "north": {"uv": [2.5, 2, 7, 2.5], "texture": "#base"}, - "east": {"uv": [2.5, 2, 3, 3.5], "rotation": 90, "texture": "#base"}, - "south": {"uv": [2.5, 3, 7, 3.5], "texture": "#base"}, - "west": {"uv": [6.5, 2, 7, 3.5], "rotation": 90, "texture": "#base"}, - "up": {"uv": [2.5, 2, 7, 3.5], "texture": "#base"}, - "down": {"uv": [0, 0, 7, 3.5], "texture": "#base"} - } - }, - { - "from": [2, 1, 3], - "to": [4, 2, 4], - "rotation": {"angle": -22.5, "axis": "x", "origin": [0, -0.25, 1]}, - "faces": { - "north": {"uv": [1, 2, 2, 2.5], "rotation": 180, "texture": "#base"}, - "east": {"uv": [1.5, 2, 2, 2.5], "texture": "#base"}, - "south": {"uv": [1, 2, 2, 2.5], "texture": "#base"}, - "west": {"uv": [1, 2, 1.5, 2.5], "texture": "#base"}, - "up": {"uv": [1, 2, 2, 2.5], "texture": "#base"}, - "down": {"uv": [0, 0, 7, 3.5], "texture": "#base"} - } - }, - { - "from": [2, 1, 4], - "to": [3, 2, 5], - "rotation": {"angle": -22.5, "axis": "x", "origin": [0, -0.25, 1]}, - "faces": { - "north": {"uv": [1, 2.5, 1.5, 3], "texture": "#base"}, - "east": {"uv": [1, 2.5, 1.5, 3], "texture": "#base"}, - "south": {"uv": [1, 2.5, 1.5, 3], "texture": "#base"}, - "west": {"uv": [1, 2.5, 1.5, 3], "texture": "#base"}, - "up": {"uv": [1, 2.5, 1.5, 3], "texture": "#base"}, - "down": {"uv": [1, 2.5, 1.5, 3], "texture": "#base"} - } - }, - { - "from": [0.5, 2, 6.5], - "to": [15.5, 5, 15.5], - "faces": { - "north": {"uv": [8, 4, 15.5, 5.5], "texture": "#base"}, - "east": {"uv": [12.5, 5.5, 8, 7], "texture": "#base"}, - "south": {"uv": [8, 4, 15.5, 5.5], "texture": "#base"}, - "west": {"uv": [8, 5.5, 12.5, 7], "texture": "#base"}, - "up": {"uv": [0, 0, 7.5, 4.5], "texture": "#base"}, - "down": {"uv": [0, 0, 7.5, 4.5], "texture": "#base"} - } - }, - { - "from": [0, 5, 6], - "to": [16, 6, 16], - "faces": { - "north": {"uv": [8, 0, 16, 0.5], "rotation": 180, "texture": "#monitor"}, - "east": {"uv": [15.5, 0, 16, 5], "rotation": 90, "texture": "#monitor"}, - "south": {"uv": [8, 4.5, 16, 5], "texture": "#monitor"}, - "west": {"uv": [8, 0, 8.5, 5], "rotation": 270, "texture": "#monitor"}, - "up": {"uv": [8, 0, 16, 5], "texture": "#monitor"}, - "down": {"uv": [16, 0, 8, 5], "rotation": 180, "texture": "#monitor"} - } - }, - { - "from": [7, 6, 9], - "to": [12, 9, 13], - "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, -0.25]}, - "faces": { - "north": {"uv": [8, 0, 16, 0.5], "rotation": 180, "texture": "#monitor"}, - "east": {"uv": [2.5, 6.5, 4, 8.5], "rotation": 90, "texture": "#monitor"}, - "south": {"uv": [1.5, 5, 4, 6.5], "texture": "#monitor"}, - "west": {"uv": [4, 5, 5.5, 7], "rotation": 90, "texture": "#monitor"}, - "up": {"uv": [0, 6.5, 2.5, 8.5], "texture": "#monitor"}, - "down": {"uv": [16, 0, 8, 5], "rotation": 180, "texture": "#monitor"} - } - }, - { - "from": [1, 5.5, 7], - "to": [3, 6.5, 9], - "faces": { - "north": {"uv": [14, 15.5, 16, 16], "rotation": 270, "texture": "#base"}, - "east": {"uv": [15.5, 14, 16, 16], "rotation": 90, "texture": "#base"}, - "south": {"uv": [14, 15.5, 16, 16], "rotation": 270, "texture": "#base"}, - "west": {"uv": [14, 14, 14.5, 16], "rotation": 270, "texture": "#base"}, - "up": {"uv": [14, 14, 16, 16], "texture": "#base"}, - "down": {"uv": [16, 0, 8, 5], "rotation": 180, "texture": "#base"} - } - }, - { - "from": [1.25, 11, 7.25], - "to": [2.75, 11.25, 8.75], - "rotation": {"angle": 0, "axis": "y", "origin": [2, 9, 8]}, - "faces": { - "north": {"uv": [14, 15.5, 16, 16], "rotation": 90, "texture": "#base"}, - "east": {"uv": [14, 14, 14.5, 16], "rotation": 90, "texture": "#base"}, - "south": {"uv": [14, 15.5, 16, 16], "rotation": 90, "texture": "#base"}, - "west": {"uv": [15.5, 14, 16, 16], "rotation": 270, "texture": "#base"}, - "up": {"uv": [16, 0, 8, 5], "texture": "#base"}, - "down": {"uv": [14, 14, 16, 16], "rotation": 180, "texture": "#base"} - } - }, - { - "from": [1, 6, 11], - "to": [3, 7, 13], - "faces": { - "north": {"uv": [8, 0, 9, 0.5], "texture": "#base"}, - "east": {"uv": [8.5, 0, 9, 1], "rotation": 90, "texture": "#base"}, - "south": {"uv": [8, 0.5, 9, 1], "texture": "#base"}, - "west": {"uv": [8, 0, 8.5, 1], "texture": "#base"}, - "up": {"uv": [8, 0, 9, 1], "texture": "#base"}, - "down": {"uv": [16, 0, 8, 5], "rotation": 180, "texture": "#base"} - } - }, - { - "from": [1.5, 7, 12.25], - "to": [2.5, 11, 13.25], - "rotation": {"angle": 22.5, "axis": "x", "origin": [2, 9, 11.75]}, - "faces": { - "north": {"uv": [9, 0, 11, 0.5], "rotation": 270, "texture": "#base"}, - "east": {"uv": [9, 0, 11, 0.5], "rotation": 270, "texture": "#base"}, - "south": {"uv": [9, 0, 11, 0.5], "rotation": 270, "texture": "#base"}, - "west": {"uv": [9, 0, 11, 0.5], "rotation": 270, "texture": "#base"}, - "up": {"uv": [10.5, 0, 11, 0.5], "rotation": 270, "texture": "#base"}, - "down": {"uv": [16, 0, 8, 5], "rotation": 180, "texture": "#base"} - } - }, - { - "from": [1.5, 10, 8.25], - "to": [2.5, 11, 12.25], - "rotation": {"angle": 22.5, "axis": "x", "origin": [2, 9, 11.75]}, - "faces": { - "north": {"uv": [8, 0, 16, 0.5], "rotation": 180, "texture": "#missing"}, - "east": {"uv": [9, 0.5, 11, 1], "texture": "#base"}, - "south": {"uv": [8, 4.5, 16, 5], "texture": "#missing"}, - "west": {"uv": [9, 0.5, 11, 1], "rotation": 180, "texture": "#base"}, - "up": {"uv": [9, 0.5, 11, 1], "rotation": 270, "texture": "#base"}, - "down": {"uv": [9, 0.5, 11, 1], "rotation": 90, "texture": "#base"} - } - }, - { - "from": [1, 11.25, 6.75], - "to": [3, 12.25, 10.25], - "rotation": {"angle": 0, "axis": "y", "origin": [2, 9, 11.75]}, - "faces": { - "north": {"uv": [8, 1, 9, 1.5], "texture": "#base"}, - "east": {"uv": [8.5, 1, 9, 3], "rotation": 90, "texture": "#base"}, - "south": {"uv": [8, 2.5, 9, 3], "texture": "#base"}, - "west": {"uv": [8, 1, 8.5, 3], "rotation": 270, "texture": "#base"}, - "up": {"uv": [8, 1, 9, 3], "texture": "#base"}, - "down": {"uv": [9, 1, 8, 3], "rotation": 180, "texture": "#base"} - } - }, - { - "from": [8, 9, 11.25], - "to": [11, 12, 12.25], - "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, -0.25]}, - "faces": { - "north": {"uv": [0, 5, 1.5, 6.5], "texture": "#monitor"}, - "east": {"uv": [1, 5, 1.5, 6.5], "texture": "#monitor"}, - "south": {"uv": [0, 5, 1.5, 6.5], "texture": "#monitor"}, - "west": {"uv": [0, 5, 0.5, 6.5], "texture": "#monitor"}, - "up": {"uv": [0, 6, 1.5, 6.5], "texture": "#monitor"}, - "down": {"uv": [16, 0, 8, 5], "rotation": 180, "texture": "#monitor"} - } - }, - { - "from": [4, 7, 9.25], - "to": [15, 15, 10.25], - "rotation": {"angle": 22.5, "axis": "x", "origin": [9.5, 11, 5.75]}, - "faces": { - "north": {"uv": [0, 0, 5.5, 4], "texture": "#monitor"}, - "east": {"uv": [0, 0, 0.5, 4], "texture": "#monitor"}, - "south": {"uv": [0, 0, 5.5, 4], "texture": "#monitor"}, - "west": {"uv": [5, 0, 5.5, 4], "texture": "#monitor"}, - "up": {"uv": [0, 0, 5.5, 0.5], "rotation": 180, "texture": "#monitor"}, - "down": {"uv": [8, 3.5, 13.5, 4], "rotation": 180, "texture": "#monitor"} - } - }, - { - "from": [4, 7, 10.25], - "to": [15, 15, 11.25], - "rotation": {"angle": 22.5, "axis": "x", "origin": [9.5, 11, 5.75]}, - "faces": { - "north": {"uv": [8, 0, 13.5, 4], "texture": "#monitor"}, - "east": {"uv": [15.5, 5, 16, 9], "texture": "#monitor"}, - "south": {"uv": [10.5, 5, 16, 9], "texture": "#monitor"}, - "west": {"uv": [10.5, 5, 11, 9], "texture": "#monitor"}, - "up": {"uv": [10.5, 5, 16, 5.5], "texture": "#monitor"}, - "down": {"uv": [8, 3.5, 13.5, 4], "rotation": 180, "texture": "#monitor"} - } - }, - { - "from": [4.5, 13, 10.5], - "to": [14.5, 14.5, 11.5], - "rotation": {"angle": 22.5, "axis": "x", "origin": [9.5, 11, 5.75]}, - "faces": { - "north": {"uv": [8, 0, 13.5, 4], "texture": "#monitor"}, - "east": {"uv": [5, 4, 5.5, 5], "texture": "#monitor"}, - "south": {"uv": [0, 4, 5.5, 5], "texture": "#monitor"}, - "west": {"uv": [0, 4, 0.5, 5], "texture": "#monitor"}, - "up": {"uv": [0, 4, 5.5, 4.5], "texture": "#monitor"}, - "down": {"uv": [0, 4.5, 5.5, 5], "texture": "#monitor"} - } - }, - { - "from": [0, 2, 0], - "to": [1, 3, 6], - "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, - "faces": { - "north": {"uv": [10.5, 11.5, 11, 12], "rotation": 270, "texture": "#base"}, - "east": {"uv": [8, 11.5, 11, 12], "texture": "#base"}, - "south": {"uv": [0, 0, 0.5, 0.5], "texture": "#missing"}, - "west": {"uv": [8, 11.5, 11, 12], "rotation": 180, "texture": "#base"}, - "up": {"uv": [8, 11.5, 11, 12], "rotation": 270, "texture": "#base"}, - "down": {"uv": [0, 0, 0.5, 3], "texture": "#missing"} - } - }, - { - "from": [15, 2, 0], - "to": [16, 3, 6], - "rotation": {"angle": 0, "axis": "y", "origin": [15, 2, 0]}, - "faces": { - "north": {"uv": [10.5, 11, 11, 11.5], "texture": "#base"}, - "east": {"uv": [8, 11, 11, 11.5], "texture": "#base"}, - "south": {"uv": [0, 0, 0.5, 0.5], "texture": "#base"}, - "west": {"uv": [8, 11, 11, 11.5], "rotation": 180, "texture": "#base"}, - "up": {"uv": [8, 11, 11, 11.5], "rotation": 270, "texture": "#base"}, - "down": {"uv": [0, 0, 0.5, 3], "texture": "#base"} - } - }, - { - "from": [0, 2, 6], - "to": [1, 5, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 6]}, - "faces": { - "north": {"uv": [13.5, 0, 14, 1.5], "texture": "#base"}, - "east": {"uv": [13.5, 0, 14, 1.5], "texture": "#base"}, - "south": {"uv": [13.5, 0, 14, 1.5], "texture": "#base"}, - "west": {"uv": [13.5, 0, 14, 1.5], "texture": "#base"}, - "up": {"uv": [0, 0, 0.5, 0.5], "texture": "#base"}, - "down": {"uv": [0, 0, 0.5, 0.5], "texture": "#base"} - } - }, - { - "from": [15, 2, 6], - "to": [16, 5, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [15, 2, 6]}, - "faces": { - "north": {"uv": [15, 0, 15.5, 1.5], "texture": "#base"}, - "east": {"uv": [15, 0, 15.5, 1.5], "texture": "#base"}, - "south": {"uv": [15, 0, 15.5, 1.5], "texture": "#base"}, - "west": {"uv": [15, 0, 15.5, 1.5], "texture": "#base"}, - "up": {"uv": [0, 0, 0.5, 0.5], "texture": "#missing"}, - "down": {"uv": [0, 0, 0.5, 0.5], "texture": "#missing"} - } - }, - { - "from": [15, 2, 15], - "to": [16, 5, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [15, 2, 15]}, - "faces": { - "north": {"uv": [14.5, 0, 15, 1.5], "texture": "#base"}, - "east": {"uv": [14.5, 0, 15, 1.5], "texture": "#base"}, - "south": {"uv": [14.5, 0, 15, 1.5], "texture": "#base"}, - "west": {"uv": [14.5, 0, 15, 1.5], "texture": "#base"}, - "up": {"uv": [0, 0, 0.5, 0.5], "texture": "#missing"}, - "down": {"uv": [0, 0, 0.5, 0.5], "texture": "#missing"} - } - }, - { - "from": [0, 2, 15], - "to": [1, 5, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 15]}, - "faces": { - "north": {"uv": [14, 0, 14.5, 1.5], "texture": "#base"}, - "east": {"uv": [14, 0, 14.5, 1.5], "texture": "#base"}, - "south": {"uv": [14, 0, 14.5, 1.5], "texture": "#base"}, - "west": {"uv": [14, 0, 14.5, 1.5], "texture": "#base"}, - "up": {"uv": [0, 0, 0.5, 0.5], "texture": "#missing"}, - "down": {"uv": [0, 0, 0.5, 0.5], "texture": "#missing"} - } - } - ], - "display": { - "thirdperson_righthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 135, 0], - "scale": [0.4, 0.4, 0.4] - }, - "firstperson_lefthand": { - "rotation": [0, 135, 0], - "scale": [0.4, 0.4, 0.4] - }, - "ground": { - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "gui": { - "rotation": [30, 225, 0], - "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "rotation": [-90, 0, 0], - "translation": [0, 0, -4], - "scale": [0.5, 0.5, 0.5] - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/masterfulmachinery/textures/block/base_block.png b/src/main/resources/assets/masterfulmachinery/textures/block/base_block.png deleted file mode 100644 index 6520f8e6c3a371f581e04c7aaccfedaa737c03b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39879 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

}1C<*XB(hAgpUm;FEKs~uQD{@25nG0j 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 VpEt~ViOCEt%Jxsc6d!Z?e*uC`HwXX# diff --git a/src/main/resources/assets/masterfulmachinery/textures/block/base_ports/fluid_output_cutout.png b/src/main/resources/assets/masterfulmachinery/textures/block/base_ports/fluid_output_cutout.png deleted file mode 100644 index 2d710513c4c2e9447a83300b62b7c9da1ad021df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34154 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 dIjz diff --git a/src/main/resources/assets/masterfulmachinery/textures/block/base_ports/item_output_cutout.png b/src/main/resources/assets/masterfulmachinery/textures/block/base_ports/item_output_cutout.png deleted file mode 100644 index 70e3bf735ee8f3e7121e5c1d65a0040d410c8a5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34122 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 diff --git a/src/main/resources/assets/masterfulmachinery/textures/block/circuit_cutout.png b/src/main/resources/assets/masterfulmachinery/textures/block/circuit_cutout.png deleted file mode 100644 index ef685828dca9a67069d00c9b2e843f52708281fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39946 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 SKflC34>fP7-&cO~xBp+s@|sit diff --git a/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/astral_starlight_input_cutout.png b/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/astral_starlight_input_cutout.png deleted file mode 100644 index d44fc225dcc7dfc28326fdd94ab27cd3861aa82b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5506 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 Y(M3@UJ6MI2U?mVN<`PEn;?;@&1pq2xhX4Qo diff --git a/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/botania_mana_input_cutout.png b/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/botania_mana_input_cutout.png deleted file mode 100644 index 98de566b731863753dcd43e4eef2b221ca9a8bc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5408 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 TPjQl8*+uB;^MXlU5ZlO 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 sqN1{edh6((P`QUM_?~4>eD*{Gg})s(sI1RT^6 z6-J6}C>F2)qKJqJ0x~cn<0zsCj3VzQU|VngxYnD0CM(Ik`|SPgy}$FFb8=JMT^)6` zO|)S!n69&vohS5bp!jI2L*J&arT`dh_Nz#5UzsNm0T)X|Tz&`$mu(Y+a8Sk#udGj{Rve{WLk*^0eA||MW+w7=k&Bel)JDYVYH#+q#HVbK+8he7-(JL`( zABUTGrOw~)w&r|l?8C5u6U+WA3$MG6muDP&8y}zC`YN*h+-Q28^@AH z-kD7Z{Qc*gZ-1E@l-5bgI%5|8r>a188?xzY@yNMdcYJzUTx4`EX-mPC_is>EWoqNV z6Plr4W!j|n&L_5sc=g@;3OVS3(iu)m8bw|GV zg!P;C?%g3(Y7s~5^eX3!++ERD7&Dr^%I0>ia%2JtG3QdI5B z`|=D_9Mu>L6O9gDo#$?4b}n&6J}(XK_~`W>s?GjV9bt+`g_T|J^;uiz^27rk_xCdT z=25d$HB4=it>Y4nB>jWzWUNbG16t>&{csOE?+gw&YC-kE~-b^GgqBQM3<-Y@1ekr6{qN1jIwo@RC& ziu~TG>e7{TOyAz3rF*tlIB;A4{_8zGSmrBT;N|5ZyoXuWpHsNO^>Y85RH|FRrsb*? zJ6SC!Gsarh4lU=AsLyuy8h|z*44*5nBPX8KER^;Df)nncAPe@o86XI{{6 zj(+l&Zm{4GslEKXac-wLZtKEMeeKN^ZI=2~{$qa>xQ>@CG^uqFLs5_jF0;AhYB#eULnUD&NETR@Xv{o2O2jTbSv( z0N8b&?SuZ~#pts)6NzpW1kzowZUMS#=s>_(wIN{p^@290!@is&$fR^Lfl6ybTC(n1 zow!(2@w%LmV_l@AESdDz!P#mm+Xs8A&03t6))gf~>%%h#&M$bTF_vtzhk<-lfAH4*?~$Xruam>f z-HLJM*{Hf%QF!2VE1YM{VD;DMn$mtZ=UIjSuw9{a*4}o3s~Od z--Ewg({L-$8KBk0WoEq4Uf4D_(xZ8Y{k_DVQO=vo(LaW+Z#uWyyS(%F z4EpZ(OQDSJM^Rlhs?~e6y;4g=1+9h<+J;!N1rZ#ss6J0=<(3*AM`3RRu~o-razTg_c@j__3A=V51$Pj z0O*;yKj<0iH0bT4hD+lm0oeyjfR_Jhtk-p0vE*zpaLn)Y3? zd(b&$%!ke+U)EY0TO>dM98n;Mk_*Jpc?E-6GUQ@_9Sq9gfgq1Bq$6JZR)>J|Idp^% zk%eK2ZNVVEQ=|m+igfj6M+UR090X&Hwxyf~0SG`D0GA6wgi@NEj!@##plgL0jesj% zWWjWVFUuWnE0Tb40*ZjbAnoP+a2#TdHr!Ie;nF<0KG!Fkz zpFqrFeS{ZEXIOyvK+6F!8jHf91p@Tv5mK3bI0Q0N&_6~ST?nwk30OCoXK{*ShGC;@%6;Kd3iVxwCaUhjVAP|rk3K4>!;z1+@ z%f%r9fWoHWC>RnM#C!(fCgDS>1VTQqN&&@zpomyJmrZ4pkYpkjf(j%OAt)Rh$z>DS zWL#h%22Wrsp*U=sgGeF(py}ib03L`I3wg=`1>rPncV{{Rhnmi+w77==GA$ zp;QP!X@|O@*-Ah_CX#rIL?Lv9q6D}iQYmn_<@B^T@uiT*HihPARPP0bPTx&0f)KuP z2o6^YmjlSqMZkfTfl#Z3>fg8(59gjV>Bq(0dB|1ezy0);}wkcmiaAe)FJV7UO2 z!p7r}L~I}#LnKlOAYppOKcY)TTv-Gl0j+sZr%*SLgp}RDSIm&P^2=%>f@-xj=gr`r~Fb!fAKXl z5C38Y2>M%+uj2O`UEk>XDh9sF`J1}F(e+gfe3kPzb^YJy(*E?g0}7#kKoQWx44?U+ z26_-u4`e#p!Dx#2B;xQ%$f6~7+8~9&bPN?A6d-lTrs*v=+)w%P694w(;bcL8|pDefreMKTKd%kXZIcGvN{=iJ^7Y_a3%I! z9cy{nHPb!C=H{HLVT^p_FS3jFmHpZU+uzdVBXCuii_F`UMm>##x_~*`yV{l71jPLp DJYg>l diff --git a/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_gas_input_cutout.png b/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_gas_input_cutout.png deleted file mode 100644 index c51a36f0a3d5415e72fbf9341a39e81e8870bd92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5288 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 z zW!|P!_Nh6$c7fUOm2C3E0$i6=14GYzk$lSjN}E@K-9-8g@3Y`0G_rDw#=6-pv-P*s y&2?kCU5)74JU-Z$xaX@htl{~@S4qP?PMU~ZYnRYS$RG?(7{O$CI#;X?Oa3pSWF2Mz diff --git a/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_gas_output_cutout.png b/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_gas_output_cutout.png deleted file mode 100644 index acdd2058bc26b62519e0f83dcff3170582cbbb28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5289 zcmeHKX;>3i7Y>UQL4p=BD7MCc6_+HF4U&|w224OOEQ$ySlgT8El7%Ed0Jox|SQi#i z%BLtQxB_*lCmQ%z>pzoclF7O6dCxiTJ@?*B ziokb~naK&$y1ZAR?XSVgeE^5>Nq^-kDY&w2nSnzWrY)ydG$3zGb)c??iBSd^t)F5 z&}!SueRhKu*Z2R`zH#=-{k2;kU)Z1g8^Y80)Fb#J>D|;rEwbDfw~Na%F07upMc2};q;LH|=XV zR~l5TrB>d)ygOrk>H(u0X>HbZ{^Ytr<>{dd`$u;+9GZT(=mCsN{Y@cTCGWIyJ&o^F zE;Q9lEvj0+Ywn{Iqn?5drFU1E=6I!8{WwY4Xm{)2x)+)A-PFy&4YVK(1NPf(5p>$< z)rHsf5t+7T#%BV{7oALgbs@Sfl2ODwj`V4@x2#kd&Ls;TDduwPJ4FO!*$-%KVJS_rh zQ!)-Rho+|IXZim+-Iumda_Xj_`l2GOZ5uf^GG$I?sOy2JCyH`c?a0s1wst^{SrF;c z(|LQojS(FG`On0zd(aY&xjQOE)v`rNtAo zJFhIM-C*^tej9sA)`Tdb*oIXlc5|SdO^KfGXyfHvfzYQIBo$f=yW(QQs~M3ao695O0nCZ(M3t~%7aahr2z$52D$N*B>n}huUvDhYAJQz&)Qo?)D;iKkr$li zgwB5+@<&b)%(v#_LbeTbjFjH)O{^2pG|_s+?#6f5E>SLiRY=!o#xT34H%=$iq3zeisvum})aVW;m_I51y6o=8LC!7KGskf3$Nud%&z0&d*u8^_)Ns#$B*lISK@kmV(*V?-0ysUKG+v_FNs?Q zOHN#+xo(ag>Q8)rYFSt_uk+=jYu$U(Z*oiUoNK;wZGVEoDvNI13TQrRS$sW%q9UiJ z4|c71W7&PUYEBh#>DjC!5>`ylpW+tZ()@zg+l$Fr0tegf@`q~-uJ;ZJWOhQQYpjJi z9y3T=&SwRdTaW0ojN_Xv{~pfn4|FHxcYfsptZC;3l=Q#26kBL|Gq0uHe*X=^rKlGve+p z;JdrO-P_O|ZQt574zJQ>=GE|!Jdco>J@~fCx$NLR)9Bsvr&YKi3(h@_PC7rBw%}Cw2Pk) z$8y)iyUizB*Lz^fj6o|40__|(fnso{KgQfVy!Vh}&1mxh8`~#lMjFF5R(|(4{YL$@ z`NyMM=3>vL+gTj2*ww9eZCh06jlCRAy4TbB1IWq9o{P0Gy^7t#&dOA8)?_mY3+8tw zp2gPeD`qapoU!^r#$_NYDCoD)qpVHLJ*h5V>f1I7JSTi}=-i1TR=kFFwO5@Zhci0T ztCt$tROz1(;P0*LbAI)pz%MIXot{KFIDGYtlPBg4ss2<*)8J{Cu>|vwrpP-#dfNyX z<|mXDc+jybELkx+ia8#vEW5o)-Gm-ORtS37EcaQ=hU8KbD3S|dl18dP z4-C`7!~Ih&Y5Gh7aJQaEBuiUV;)1Nbn7W5>`Vj5y9EX z#8JaW38b(Z#A~EcG8J3HA?SG7=)KlVCg61t^=b}bxsL$vE?2^MI*CpKh#ndwmP&9k z!8WD?zg zR&chffX^XNNn=rU7C{uK7NZX68bD+sd7SD!I1rJ-0cudIC&ix1v}XYfiUW;KcVJQ9 zgOpPOQ^0FIbq$Vp z9Gey%qCyez+MXZp`T#h3?AO>Lh(dHjc)YH0*&s9)LaKxs-=l;>r%=m81us~I!I)ZTFFj25 zJ}cDtg_`f<@kOVxDOQg)`;_KO)Rf2Px&|_9pa?5^M9$8eZ{pePHz|I1WRY8rV^89- zsRgo$K{Z=R2n=t&a}cW9ncD?cUc%K zoHY>uX)YnN+-j<;f$Qj1G3lyNmf|92Z!S09HDp#>&)g+BBb5@n7NC4u>hHf`PU>~( zZFOtcKVoYu`l-)l>mtUM7`$O%ALX=4hVd4KSooZXRxB{0lT;4Bx|-Tj&;%^k0=o B8Xo`v diff --git a/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_heat_input_cutout.png b/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_heat_input_cutout.png deleted file mode 100644 index 411de436e3a9c862ef82f5dc87f06900793a68d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5299 zcmeHKXIK;I77kLBj_4`~NDL~dH6{#eGPh zEI*6h)xAiz7XO%U;&$Jl;$>oaVr4nV@{a3XGaM1gwY(b7v8%L8k-tLKZ`2;W@q6_0 zavAm2Dp-L%E+6Y1w46?hli&5qanxF8>nh?PP_3MY~Z(Ck~&DnFK zP_*n#_u0EQvl7EDx0Q5;m4i7}iNs6G_q~~wd(;S18f3w{5A#;*Q>isjRWV6brJwK5 zH(0Vy>qnfaGX*V1)O+YgPa-2@RB zlg^t>E90IwB@39GOs5TMDONYsPPNi>=DhPj>0AY3ou6rv9?27~-!>a)N`AH;&Rs4w zPv836U)t^WZ1}~XWC^}ew7dh?psy8LcE?8lqWQj|*oBjQI(wSjiQy;fhyK*HbW3$N z{j;9D(c~?rd1BNiqj_`oE$@>{n+m7m4vds`99_MryD(IE`+a+B!bwBl<40-NXQQhw zo;X;OUXX1gW!y-rasH_pH(vXDUTDQ7dfZ4@Vab!?dC|-^+~S}t@8LTd%kn!013V^= zvwQuwk$U+%E4@rAGjz9)r0jRMv!;ak+Z`)?mYcmRv%G>D()Yag=z;L6_Wp^KO;m1~ zEJG{yz~-J()1I7(&>mfM+}yUSQ3hU=u044cx)V!G!}7E)E=wOjJ(3di!I#^%G%voL>24A)+^2sox4E|ZpqV*1EL?{Hopx_tlp8?$ z#q8zA{-0N08)!M6ZY&WlR5x;$Z!7vW>8wfLxpFU3a7DMHU>r`gqA{2+l2tC|BC z%|lpUpl!jb-W`k9*WdK~m`$U+`>@5*$GRFawSLOU;pJl*V@)TEqIxa$$}+6x9iF#u zSnAmCT|2Ijr%mZ~%Kz1yq#5Bjg3 zaot)osD~Lno_aOh-7dFxjf%{^P}ra%zvR%IdnY);{FJ`KuB$=SDtdZ}tqAaJMdj+2 zuKU-xL2@~)C{SG0ku3cK+J209&^8mmSVv_E`6z%bWP&IeUj%JKFqnzi|{8fFbt6s7|wIqA_jf7c=)omM6f7qguR`Xjf@Hb@Ifg6m+>P7 z5~|D=p~R&^*9tKj0auzxBWw`?3{SX|Pz=KHC_D;-q|10QIE0-R+(yjiP`znuXCR&+lL6PtPo&}Of zNEQxbjl^T{93<14!a;IyI6RTW1aT}jP6@?kQP&E^d;l6w9v|R>Xpw-cR453iI(oX= zB5)|oXNhMdAmu;~&>Y|i*uq%JXO%CH5Bf*}1)o?Vj!dLr2sk2^fFV(=KO6ahVhPlX z3RElxg~KZ~ih-d*63&*o zGU&4h=VzwI@1YQ2%n*#F@?UFVW~6*fF_yL#S(+^oCCzNB*NknZ}LBMmh*q9_Yh zr+Ua_A&FUB_jE_Ph@qi4jE#-`4rSggsodM4zV33!_D0W)kkNr#nSK9pSk|TfMCIR& z>hql~Ts2p~;SPqO$ZqZD1=Y^3KxfS^U6X>-2ZN>(UQfs$+)C1cahLgY`V}v4h6;eW M(miOUYr=N?7pU4FGXMYp diff --git a/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_heat_output_cutout.png b/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_heat_output_cutout.png deleted file mode 100644 index c650fb2b5b683b61e0be7fdc6edfb6049b3a85ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5297 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 a6p9`m^loyn9~Ma%#r0d@TjjHS-G2cw;rH_Z diff --git a/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_infusion_output_cutout.png b/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_infusion_output_cutout.png deleted file mode 100644 index b3410aef6a413b9625d30a9d680b83af2df158ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5268 zcmeHKX;>3i7al+mS>l40xROR86ihN%Ng`n}Y|#P{5k#~ynG6si3&|h>6&2hOw5|}L z3Mzt#3!o?n2rY}E6a?HC3L=VFw_2-0?Ihs#eEs9|eEsJnlVr|)&wI{!@40s}8%2KJ zmSz*o006KQ`gjCj-=lP=sR{OJ^Wq%@0K>`?0_URvP#i(2QiMyR5ds>oLU8{q_?6PmesGGpzgB1-LHT@ z4kz2Nb7?2)T90R$cf@S(T$9!z6kT2q7Ltmm!@#}Ces7?8y%{@;y`7$u0_73Xv)?%NSV`c$M8Y{h1caU_WY_{e!CoOd)v}ZiK@pGO6~Tsa#!VjYlXAZ)+|^}oj}T6fNAB5TUZ&N5cpTc3C$nG`gC_xL@AjrfbH zq!KsNms#Gw1DeIZR#iJDyT_fIZVEnh_LX=$mU>Nj=FSwfWM?f)ow>*a7`=SP^mTZP zNdLZu?YO#O#18uoQuWrb)^rQA2JYMwv)~MV!)V5G*l(ZUDu+><7ec5x(E}_Yl9Vj7 ziO)&%-Ep?{O}w77=6(y&^Tnli;-4hj)KZOc?9&|r(=lS78gcE$-GrQJvo_h$H|)8ZWJzA!m}CYR zK7I8w5RW&GR_3lf!dfD7;z*)tylG~j2V}%US+|x0@Re|aCleR7<3(ed3s$OODn1DkJf70qbyKgp^k>~oV zf6m`)bAN{b(Yz|yza{8#(~79b*lUkVBIOj^AzWJ4=lC-~CBOlDayVIJ~ytP+2mCkwdUwY5RTokR;gu2f#8|e~ z{xrs-M%e@Z_?#w>*W51an)VrWHt|t1TicyiLi&lLdvYo*^8M?6SFSKGcw=&OM%3Ag z{DwCTeS21$7v;OaFMixO+q>fO=m^8E&^&EANy#}mN7#7^eq{bvuR5sdQpbzjfGGpa zs>$DJ%2M;1;0qaBTiK7hc3dZm(#<*VG>w0maq>|$Y|UaKt+QTI;oqqA{UF_as9 z-5C&nyOxBrGOxw$;-&9I*J`vJqN79ivSM6gW+}&U=Y*)++pECz;NZ&(4{_IUc5QVV zV>qo%%xi=(Z%E3ZxvQr6K~Rw!I{t{VqFJ+QGXa<+^1 z&P)T1>wd)rgMm`FU$w2FQ8tH0x~(f)P-%d}t!^PA$I8#nXuf{4Dq_LF0FWP|s%T$> zUcv4+cqw*YneY2O4_3%1kVGLyC>og(yYB#iv#Ul4!BGfG5F-&%IiL8XyoyMWO8CTJ zmM`e56d;jOp9B>$H^DCuPKbiJ5~8b%nX`t65y%h}B4}jMay3uGC+c~5*l(SgN+jqZ zXcV6~-&aHsC{zf6NnuhzvZqG6lumRpBRH!h;k*D3uOSNTicgG0Q6-N`jf;z;#4#ue zRRopB<#MSYol2*ZF$7s1FGnE_S+1U{qZs7yK-92Gszjvi50OZpGd^U3Gefh zDSdrE(96|BDqwn0HIR}@qkvSIjQXjE8ueU?kqjmDuO8|^?Dk9zK-7v@6^wW;Mdawz zPbnnu2Y+R(Dq3HT1g0X&CAFA|anhrwm5bTSU@oL`(HU1cJVC zc@R7pL=7!PB>F&@-{24&3CSZ6Y=sZC)O)-1U#5#r1DzNk2PD&B7KhAaLLgZTvO#jV zghOLGacB}J1pb^|tq4csAQj>sfmMoCgSC*p8iM_hnBRSlkBdZfN`Z758RU>@^gxi# z!`=)okvdc?Rkx1MyK*~E@<2H%|AWQH~$43xc6Ot=Y4i$0ScvT zxtk?QdotHpH7wuC(sfC!h#EZEGX2@Bfy%I$g*}0J!mhfCDeIwG8-AD-`7UADw0}Z; z3Xkfz`Re4{$~xO$gWWxzzw3PB-8ge#D6Hy>QmrMKhM^EQCskf#Nb!5gKlD&Pp@q><0)ogpS z*7X(ze=cThH2BLdJjE;_d(R)V{*V`^9Pr&AQXB4UYiQ~%OdSWeCNp=*-sG$>lR2u~ zf|C-QLQ@tz@?Zb#lv8_T(b(mOT}@Z$$F9zRec3IGrr_h6e#wc>*S(W5FL`l(AuXq~ z+wF>>tr+w4ye@&$iw}Le+urK-QvW5b3)b)L6G*odY(Z6?Mf zQYtWE)=@d0%l4tM6@KNmS9b7jpV!r!oD}i$R&3WedT&>&xwYbH$-^vj+IWnv$J89| zzVe#f)3XvP7Rcrrm^yASTd!v_uj5)nl^K{pPY#_rmEe4E^HH1XnqFFXpdT%pYP-w4 zl5}Xd4ZLWca7i}602L~io0U`W>J5{UC*zKFY<+V~t+G53NTc0t4Su3xHt^Dq;EGz0 zS!b5?9jL;GtnH1(+|{4JzPy>EN};}X+g^M5oubTVyZ7oB7}}K1gQ^4AJj3ixn>_rN(IQT&}U+I@@XbAj{gV;3BN+q=HLRYf_P_1jQRJ#FEQe&4khX>6;P=PWGu?24>6-g%=6 z?VT}c7rk+3RH@x-V1Lh}_O!ayS=IhWY-)3d+ZU~=dRlK~@}eO>uWMcJQFegg{9C8p zE+?;yi&#vU#fb}gT~9Mf)pINwoFVv6b8KP6K;hif=aCtmA<+lDmjqqqobaDt7L>C= zu3+G7)${gr`#mU{S?tn&N53F!%#L*pvTC7^cXOuC&d@CPMUg7A{+3Css0nn=grYP> z$Ll{&gxj_5cRzmY&~r6=Okz-jy1YJG^*=uonwh zQ%lZREEP5XccSHXVR)Oe7>dW8twU$0PV}*c^NQmp7ssWb*{cUmiD!G90K0B}$WJjL zbf1ozbH3(k`E?)4$;XGU7W9O0J)2BdGVn!5{Cw{>iFc_8#Rpt2m9GQsQ(O10I=c2v z?xV!!j)iHb3)MlTdi~^(_D=Pxe*J-kWk(k*kI0 zwgvpm{uQ<)93|)2DZPkotn8#)Z zm@8k7kII-owcG_>aJDy0)-#O?d-?~@7~7PzerEDggK5GLtKhNDFUM5exWR33Tl68+ zKYZeo@+fwD+uGK$F{Rs$0=DHxIr(|9rlcC)Yd!uj!3|Y54lqY!DQ8{dNMo8_MNgOz z+IP_5`cUhy);8TH`bxdWj3YgBUg^K8J#s9n-PZI>+FbOn=+qvC^J9~=`G60^+;_!MF&J!N;;4jU1Fr1V98S0E|);DV8&pEUXrniCk;M1T02t zqKIH&S9tkiI1(9zq2j4{BF;?-uOVX{jW7-}zJTfP>OKmA+_A9X3WbzOAjHJP;A1Fw ziA+c!F&GR2kxU?yafk&@9xGM=N}O13t$`T9aE0Wc43;Wji5R271bC8Y1q+Ks^q7zF ziKJd$pWwyvQ5FzB2ueUoAmNDwk%;i6hg{*d1_2oj=pQ}gfylv3@Q37*Xc-8(t%1Y} z>n|br;3t1+v@BAa4j&{yk&p;6l_Rr~zM9g5>*f2&LqmZO7D=^U2-#m*Dqz89vc8H< zqtT}GWgv+AC)}^BKjyAAMy$NNn645qS`!}Em4(&J&*V!$n9tN+0uT-0(;)$lXh-Ma zr~s9Z1Betpj!0tA0UnV~rVxQIptxeW0uY0c1_}Yk!w3$YPqw2I86+Hy0+A31I~tBh zqXRe|iAaKobdUj%`CmZz$Y7)@fyghT(m?SMC;^2}BJu4QIEp<8;HXrPfn$IIK8^y~ zk?0I6oyaFKv`~DI=`N9p0Ax8~5g>#JQn660&=Aga_T{p$WIXY+#5WR92oMKk55Qu+ zBu4&O6$p!<00p4olVnGx+cAhVI|j|3ZqFcpHd+SBCB(gw>B$9>I1clLfY6~3WFtRM3upF_7)ztiG)dxUPBX=X4AQIN9 zFc@v&G68U85;?F28X*+%8&QGbfLI72JAAaHKFZ;LST349g$@xx3XV?!$v7%cK*urc z86Xa_r}1f2dw@*kLE1Dvq01!#MGPQ=oP|iHNH$0bX|uu19VK(#*Y+{tkcKHDnS>+K zaU^mek<3IsR0ftXnk+%Hr$1)vK=>a%9JB^sGy%kKM20jMq*oC>HLFp+G!*`euhDh* z7iU1AzfbZ_{C=nFJ6+$zz&9CxudeTOeG>!UWc>{eSX}5#K=FO8029FNO+ zTvz8n`gJhOoQjcg28XYiJR08OCuEcx1XwL|p5at>$1*=_V#uwU8lwW|suU}*BBCTS z^X~AlvGMToR}@}-v$3#TaBX$GyUMU7%NU*W!O+;)*dx_yeg94!wA~mNw#$!cJ9h$_ zkz`ThbW*2z@)hIR)nk43JNz}!QJtPJ7@SBm`)%yQ1bzLJKYNyi+svLd>%_)Q3i7Y?E<0-;J}6Cnl_Dkhn1WGRub6K!Ozvb8XoOcn`ANCE_KLB)l#$R;XU zD`-(F-~v_!WvNmZM8t}?K^23j)go?)h;$Ngd%phhdA|O0@=P*w?t9*Q&U??jH#Z}2 zk)PRQ+sP;t%8cXh9gO^bp}ma^kZ*^lqaX@3@pejRm?{`d!pIdefmi}#RLOD}1FOXX z6iR))Ye{6ji<9Yya9a2TPoq-`^gWm(o31aso{?P)ds$4 zYzun!`@+k)o(EnIX$o4l>^-p}`8j{&!C)q;%TcC?PMi`(VSDw}x_WXJwQ+Ne*RhNg`}_CDS!7?$-<}&%4YW%<8@v&Au&fH#2Ix zU^@76_K%vi^)|)5J%(qaWM|u+@$T$n^x5nxx7iha1$MY~=|DEKtis0C^62)?gK3rn zMt9>6rZtZGl?)i4>ZY;Uj(z-j%*5cST z$O=^w-{W7jCLnc$8)aj3PEq|^qok#|)acRG;`mc0qThX+)V;RNzuGkVZy$Eb>%EOmYx1z-D7}fZdTeV{I~XXtgb>#Y-Vv!k9?i@uo`gx)_hT2(_4kEe z{ldN7h39ONX_bcw3eDFvHW?bvJOyM%=h!VTwB}{mhMYh5;9H6)lv+%2+HBn%6zoqF zFZfDm)Ou@sJQMP|&^!%a?{7TY5?8MI;cqGyOT)2Sq@il45x1?^f>9O>VhJ>YBR2f57?6~y^PQDS^BA7|}L(c3VT{53uE7+6#{Ze=P)_(h!`-!&o0YA7*dsF$m zqEitxJzg03gVhs~?0H|1-LE!oN7HU#SHEzZx_{FBJYV)VI6ao5%HZkjSqk%4S88tm zb+}b=x-#1S!sWy80`pW}r|5!as` ze_gUdf7`arE~nSayI&kFp#`3DPPKf+C>xmPx-{1I>#0YlALg$!pVACDEN(XG zTF-K*2w4__xggs4cY8=qykw)9zSY^p;QeYaUGw7TpnAyP@o5Ab>mW)`tv-202`G~e zcLY#Nit5jup@qN79e!SYs12LVf?a?pAFGWIN`~4jb1Lsz4=?WP4>geX6_y*GKh<#N zQor9ahqX^4o~+D&RhQ;m`c)efT3o_eGvK3$p7CV)nPs)Hf&pS|QGafd`D)&Rx>Bx3 z|HAvV{aG(B*V%UuowM>N%e8yh5^!9&Vy$!ZGk1%c&8BcI|mZX&7=EE-C9O& z{^U5T&&)tQv4>H1f6jox!1=QB_--e3b-uI3PZk^Rt2}!AsurRf;_=rX_HG4P1;tKi z3zKGa5p&BX)mn8i9qTf;H?-ATk&X z0ze{=NH_$6QzlDQpc*GtI%+A#IJ{vcq!7zhVwn`9UX1Y2sU(<60bv}(pc8Qv3Pi@yc@PiB2Wcce zk541H^573B0u*ATDnZGIQE9382o;4apaE104@aRhC^!m(Ov8ahA`OQGK?hyQFr7~Z zbX0tZ=_^yjfyi)*<3J%ykV}QS2Cd*sk3bF!OTv#qb(TO0s1hI!$Q%$$`LZPCdvK^Y z4h~U)T0M!bB)TgDpwfwCGMUC8z6ULa6-uNQwX8${Pon5rv;)IL(m|vJwUvqx=X__4RKNgxsHnlKn$;W9yJ ztP>@e2=jFvA%0^`kO-6tVPuAnm(*Lk_+N%gK&KHYG!img01-e&9D;Emk}-}*;|Zt$ zoe%P1!N=@MnLw2UDqs&Gk|~l6QbM|HFwWy*e)TavNd#+^0!Tz0K*teDp#X^qkeL7x zOBhd@_k$>+5~Jr4)^rDmmUBq4X9g#+nkd zBj>_sGLt!)5!5LatuIIK!=Q63rN&EIHsHlDytZ>EbULTx9@tcNPh@VWf3kJDsp$h- z=bGn|Nv4Ox%-GIvni?BXB^zIe*h72MjQ8n1ur<|QBogVo_6EET>dlG5H^R>G-v_Rz z51uV>S{Y0tRkRsDJlhp6}hDqrl(g}+HVM`AMxdYFN1Fv$Qld-?D;5^ Y`&q9lch8yAkibzKpGDqPo-wQc0ocb8XaE2J diff --git a/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_pigment_input_cutout.png b/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_pigment_input_cutout.png deleted file mode 100644 index baf558eaf406c0936eeb8c9a8f74fde68f97be4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5290 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 B87Ke% diff --git a/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_pigment_output_cutout.png b/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_pigment_output_cutout.png deleted file mode 100644 index ce95aa47702efd546f15246d3427d6fbff58c4ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5291 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 diff --git a/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_slurry_input_cutout.png b/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_slurry_input_cutout.png deleted file mode 100644 index dc6aaf182606d7859531e334d8419301692c125d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5318 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 diff --git a/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_slurry_output_cutout.png b/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/mekanism_slurry_output_cutout.png deleted file mode 100644 index a3c3cb3b0e071689f6f32c90fed5b6e2512ff164..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5316 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 Q9<2q#=Y|9xm=TlqUpFiZMF0Q* diff --git a/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/pncr_pressure_output_cutout.png b/src/main/resources/assets/masterfulmachinery/textures/block/compat_ports/pncr_pressure_output_cutout.png deleted file mode 100644 index de783d5783d3ffa59952edd38c54b90d3a8b28ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5301 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 J*y8Y{{{o1>872S# diff --git a/src/main/resources/assets/masterfulmachinery/textures/block/config_generator_base.png b/src/main/resources/assets/masterfulmachinery/textures/block/config_generator_base.png deleted file mode 100644 index f1ca80199ef2db127039c03ab1eeab3a45293adc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 701 zcmV;u0z&PM65TQ z`Er-*IJ@8e7}Df6z1zIc?`cu7L z*K2uxuh&yI8xc{b)A8gv!{JaV24GH((q{md%Z1wQ_KgGB+}xwz?|Td$Kmbw$s8*{{ z&bynlTCK?QJUwpn*akq3`2Zk+Nx75)XeGT;0suhY=5Z9Sd4lNe%$0XU9xvjvJ1#<-OqG4>Du$et(?z|$ZH zbr2$&lbB>6Xgzxx2mmqgC<%h-c3t=HFu?Z!ypxxV{B28RS@v})=6cRGKZq`~20%K# zj^RDb3_Ko}d&+=S&1O?yXEJJS0OZD!YJLaEHS!H%dtbCY8{az((gw3}B6nfw1?ZjC{@-%ug+W zWWdYX7jjD$kbl=?D?3jhqf`SqEc_piwP@#z@=(-Bs= j%v#SCFfITvASL(>;^QOdOD!(K00000NkvXXu0mjfJ<&f5 diff --git a/src/main/resources/assets/masterfulmachinery/textures/block/config_generator_monitor.png b/src/main/resources/assets/masterfulmachinery/textures/block/config_generator_monitor.png deleted file mode 100644 index 5164db57d4dcf4255c46f57a51bdbf5db02bdddf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 711 zcmV;&0yzDNP)cwh%8^yvxF@=qo5RIu4 zg$taij97@EMlTmGe>4U;Bj4Q3&QK$y$Mx-6t&xJmb+4^tjv+m z=MMlD8)xZs^aOA0@ATCHh#Z&y9R8xU*WY{?$KY^wd~bb1M<+wH2gTrNjk z11GPYqtSSmisuV-=h*{_#3M=pct5=Rl-AykjR5*Bfa&#mstEn$fKpHmeoBGe&tEuN z7$T-w9`J4CBS=jqu t0D?gO69qzmP=Qc^P=Qc^P=O!{{08@2mrx{mz`p57O4)PQ%U*l0b<*3qU+FZRI?RmefJVAsXHI(W zIk)GW=}d=URE+XoluB%^p=lH$3RMsiLLv}QluAsrL<7q!V z`r@6t{Pc|*Z+`2Gce~*|)5SqQJ$rm|>+m;z{3i|%j>lVv?{bf;$M06tbH{Ic>1=xH zrFT9(y!4(SjE8T1%fXvpJmLX&ri{lKbW%NyDZfcikedNrMwg=mP4w>z2oR6NY z+wENZ?$+UR7Z-PrZr*(1g%=)u!9IF=_Uug^LXc+|lkgMC`TI{Ux)+m^^Dn*kgnBw3 z&W`V19G{*X$P>H%^!bZhhpcq-3U}^aKKA5%yG?A^%@@17H}#`RUTOKkak%`syU(B9 zUM3%ho73&-&UA8d&d=)0pS}Cs>BZ^!bEi8Vefif9Ou*JY{`ln_SFYvGoy#fCFPiu9 z8ru!I@~6+Ae*fL+=9AO;>GNm9)Vz;ne(AlpIlp*vdU-!r4Clu$2VWe|JI2c2Jn&M} zi^n^DRQ~4jNADh0XH$1^diM0`>Fs;6^TfSfJTT@_b@1iyIzAasUpRlGyu)_DRCgEC ztwRJ!B`QmFcv|I0&K{-VP0Ac8wfWJ{Kff`UsWDF z)>N4eS(cbb^|IW@A3u8RsqsPbNkv2j1*<=#m^*))0G)uZ6>yxqX zy3D9a<#xU|zCInE7pau-n+rOg4m{)K<@u0}YPL3+Gv^XzQ=fR%XNj9S7sA+$xnbFh zNFM#!vtx8bcl-XQ%Bn`5XtFFb-s;48ohCz`h9t~cNOYI_ah$R#%f`b45esKUELs+}6)G2TJAx%QibK>)q*Xzu{l^&EH zIG515)z8W&HmXNBRp_zrd3nK*_qzv z;~3QHXLX%Q2lP~~d4kdDgrv=BGJ4ew-7xEE=vF^#?q}3-p3JG5QOE3kuUwv_qniBC zrIS;u_senbvcZ|e47pDH#0onML*h8h(DkVe+OJ)gbF-V%v`bQ@P|YSC(e8Lzw#z$} z&uK{2wE9^-*K>wz#Y1(HEAC@&Y?`F03T~LQ!Q`vY(V_Ve0?T7M%{floAvg1)X*SwH zYi->6{p!5RT$d&N)U&Rh{SqaZm^tgR&Zc4NSMOJbib5xM3A$nu`I?g84fbqMQ#WO1 z!kVq!ugsu50|Mo6O_RwXU$TRV<{gz&Sswaf^|P$?+S?J&dGZ^%M{%)VsKwEBsn%|_ z{>oAgFer9uMph>;>q0do)8vM<8}!iStM5>j=R=+&rq=YSoFjI~q%(RVS2z#GaL}vY zaW<(Bo+tEr(GzI?!Dv)am(RK%2b-_9L%E*ZviEorvMx@vL;4dW1QGK=8N2#!=YE=| zc~LT4%0*U#Hht3TF${=aXXbJ3JLUoJC{sO(Az$BMl@F24(~HF4(N$q z?huZR=P@2Nt2%Ci3qwd(@0a(To*mD!3Z=ium(MeU*E{z4JcKD*ukU?GoyAQ}ax-(m z|5!Q)U7v<=#JkB*Vr*TX1Z8o_t+Sy|=P<4J<$T|%zE2efk;Am8>%^zpCx|=d$(hVw zW50%e>U!mqG}joANqmzq;LYbe(TxtTX|;~_^QdfwUx*sRl6mo0jU_w@Xg0;oNuCb)CN9Mkt=9M0<;*(bb!@HN?LUsK?ef7+vqkPhzu0Z`s_9iSb{I6( z8<+O0ee$j!hItHF#Q}dc<&Bb%$%*og%6pAFv0AToV;@p8;9g4jGKxXOm5oG zn(MGuR(oeX7#DGeNCNvMI)~_QPN!a>9%mm``*KKx9x}{7@tXJ(*zJBGD#f95R%esT z*4wl`XcrusrtcBhWnDejIvEfLH};p6<>pxtCZy?S3|#f4hp9-uvIvzc$?gEGdTj&5zi#7j@?Im zuL%>uk}S$Xj~+!$IN3WjqrZBU_p6^pm^~QW28aj|Z=Tm<3N!J3 z$|4dybA+2aBmfxBz3+!fgIcWibLKR+y+)vB{0B5M`W{zeMBMVp0n3ERuGXt_rmSL< z6SN)=BqBve=bp&OO~dGToLjBG<{ZFk(D+RGXp;;z&!sd3ekq=BuMnAj_1)(DeORLG zFfaNGf7OmE>1OL39#3ZdYWbRb(-YhQETQ#y0{hizj$+2$4Xc zHm|axsw=IFs&XaRWn~Ieh3bkBV>2u*T%A>f<{__JhN&jhLDx2SrcST&+Bd_p+GthV zqOH=p(Zq1p_$*67pvo-h;!`iwW>}fKGUXCmi{h!9LgS#@rfu^^TUNVc7=USMO=_6J z%WOgCs#GnAaaxw8xx!^wX4BTVthJ3{JL+2NvM{E$jVhQB;NS|$+YIx(LgiY824pfF z3ZqNQ!+h&()$E+Dtcski53Q{m-mdfo4=S20<=@in99B0a(x`NqH*x^JFln26S5$ck zmUo5vT^4EdUc;T)@NBF~#5L)o`&z@IO7oLlOOv@S|jxMF#? zvPN3klwieyvlP2zGR;+;S3XtNm$H*Z8C=^|Z5A>fRP7S3Gv(YPQoN`)e=R9l6> zygRnUAw?A)&oyNdIj#y1-sy5Hw;P2MN<(ywzY5xQMG(6z(iOF2d;x*Fx`dYLT*Q&y;i!e@0;T?LLT z@5Vu^tSvL!Dks;pWJhYyyVTX>5cC!P=Q1qUh@@&V4ok~UdYn98wH2aOr{vjoYzd(T zX)K@RRiTz^>UG)Xm91S$(30)Crsza&wrSJGm&*av?5#(>bn8_ecAXnlHRsMYZdi%6bY@mt2)*nJsTqZ&MCm zBR6i>HTAV`s?yYXYYQ1xmM*Qh;6=!+<^^{wGMKzoZEl;i4RQcwje1P8D$RXaR`sqe z3At^-l-Tk%Tdt`tId)|XOUE8myJibz@Tuj6xYbBWp_@?TO)5#f-1}X+q%cLR(cW3p zY?XPYc-O3|_-$M6I_|@Zd*?HeeA9BoX z<=nM2SIGrMD6c!LQl_zubFOXtvXi8_(VMj@ead~?b#X8h`z*2oWYn!wp}dwgtqSp$ zT5cwXEDi=6i*0Lhzgi?=*TuoNBRJx)DxWP%fnd((;=dWwWPaBTsBw4jmaN5cFOFeD z9t_8{Y11;aW|xOo*XWrNiNb|lv~pvL3JaIE#;53|9k-hq%BCSP*!V(bE4kmI{d7%= zA~d^1xo*n}XRxtcYEcS4lqhvurwtZ|RO*h|8q7w<;fXa}6dt#(wk;OGwb0q>0qq-{Z%8Ehk ztG5mQY+cJMbBA`!*5VSQZyJZmT|`+`q47S57Hk@`>vqrGOkPRQz>X{qK`aT0QG!Kl zN3a-xdwm5kdyib9kgnWhPSs2z=b+KAZPTFQOPrP~Ou@?|+40=84oZL=MJPBIg^dP8 z%}jg6&AS|_T`L5D+UMa(6uj*B*&=vDUvT4xq6JWZZVYvK)%Y| z6+qn1kyuADLs{FTXr1ef^c8`c;vIuic$=Sknmgw#vbw|zk(@rqdWD~}b7V^tS(IGf z+~?I*VbiXWIC842GVfdK(LPtm-p-LBty+agQ4|${`4!IGu8~EN68d5_P2DPt+WH+T zgE45u0$0>l^;N*vt~tw+xX^~YR80*EafMC0Z)BbOR@pqLMdG<~go$a3yXUGjCb#Ax z>El$&v}y{41!}_;7xZ$@hem?zg`kkTn#+Te9oeCWM&jA&HbrQ4hLN+ey){jZe+`_z zy(^VYQRzjFnsykY$eb3P7a9Yt1@pu$LulJJvqpmb+Fzm4FW=J=vzKKkJP|%43qX@1 zlqeHh6I{fk&px!b+)wtkV#YRwa}-l*8$@%3LZN@rXD&Ktk>TBA_;CVdZZqZ69-qtbYHr+B&3$jP?;@p_X!0(J`bt{3x{x#!H=vq%}OXGxWXQJ zmEgqKmb9S5QsL)CM?QEeFv2h@g$FumuZ9sW&y(2X0lQL{$h<*`A?~fY!uQ!Va=F<|Ek3Z?oMb9X)!cO)kC--jc%)b)c2tX66W8z>ce!#6L9WGBPhLaSPZ~ zR3}_9lAu4;U^d`yF}w2cNU^*U=HYq+8pLk4V`aFfs`0rE;+T-|hh7`m+lNPrdXV^#?SY^dd(VeP%HFm`mRp6=EsE=mWQXc9CC=oMp>-px z&4Dx01_&-Alof44{E$^SN>jB&JF$@u?GW#YLvKq(l+>!2b;utaiP#WyyC&ytMK46= z#M2@ivP9U|)qVcKIX!v^WVEno>Y4~CHs?blY6~t z1r|?X%c#f528!3zwmvK}#1Y|xiN(tDxF>ZQlfKqi z0$P|^W`oa>J}b$)kX?XS9rfPuB3uguCNUDb9MF0VSWN+DNAMH7D-V*H>nsw~jV%eyiRQ%1tV z;K$+J?cQHa!YdFT8&j1_Jm_*$wScq^=$sfcG7`4{K%@jofT&1b1;R53HrPG}wDJ)- zg4L)Dh!d0?0GUS6{D#~S>b6ZS*hOs46gasu4Trz1Rv?lOqbQRknVqV|`{5H^9 z(PAhdt~bj75huA8n=|+ta0Y&cUp(^E=^`g11|D9JT8NB<%LzDKRsnJ^fleWTpf^np z?7{Iwd<6|gh^psQ{IXi{6+z4cy3aOsi0x2LcyDtuOxws~wKqkmfx@dvz+nm5ArQ*i z<1n&T0<4&S!T~l_3Yu(jhZz}cm1B&MhJv6li|BccY6a@A5z_@{CSzFE8S4+gFChJq zy~TaWEKg^H#BLXP0J{Nwwqz1P2_qvbAd4(*Byq7wLQ@jGA__PR*x%TBR#{uHCqOgp z;#X_#X6g$7NpQCiTWuBcoUDYP+Kc84XfUo%08Y#acOt8;_g-zyax-8)O)nbschBuY`ot0b0 zD?$LRjVp^Pi)b(aq~we?(-+I6R=# zvgVB>pleYhS;-+oi!Nh(OO_Z#O|)HZZW%rY*)NVW4+Ighk)*@`bkNhJG{ibsBl&@% ztVy}yE<_}OKv`>`Y)J+2o?c|aiDQG~7e%xT=|e?cXJJXmNL(X<^2sPQfaxf-lu|3sYuM07VJdy z5UJ-HyGUwP%tY*#!Lbk?&l0f8NKi>kA`x?ugOx`-DRzF}Q>j>Fs~S9v#ZyJ>ByI(# zHr%&ZR7YOAY;k6#SXJU;|FWC(K+8!2TZ zO~8Iuiv|n0iFn~SVPuWVs|tATMRiuUY%G{F+?&NWfr(Ppj3hHtvx>-Sjqewd6?Ueqt1fc|FM`V4D!}`z+wH(?}85c-bKmD>b1* z4(B*+V>lzpz5H9bffx{~V)3^(n=G3)X<1Q#2{SArePzhg)RU4VVzWgZjl70zy8-5b|M1hydhf6ZMo(`IN>8 z;vh#>Tf^O;inemTS>(0?XObwb@jNnyg^AcU%m9yau?~_;DiwqVa0Ub`c0U2LvkHW- z#lnc(uFeQq(s{Td(AYLuSV6GQYI8UP65_|^Z1+7ClE|6xi^!}jx(_q}V2Uy!Pl`FM zBYTU9#mmGi22a19pFk0mC)KaglF(Wx9)S=<6}c*GMm{qlw<#I_{Z0jW)j6i1B~D*- z0xXDi5)aWRLoLIdGn=eGGO~QP4zzI@O9Puzx2poG#LY~!-h4D=w z9f_vSTJAL1hY^Zf8HqYlJOWb#+?U(Em8=D|0g&l1z-h#O0xD4|iSi&a5}g2d8yhak z11tu{Fmj&aZn;1jbR!8cu(+T2MgV!Fmm}65W8_jS0v`D_Z5bnZQRg&gzw8ivL@))| zOMrcl4I`@!pprNhDb$EXo0J7bVUi3dCInH4jU+y2e;kDLPWrHMON9gl4ge68N$|AR#1I!i5)f*PL0xb1D;1bAfj0mg z+a5!>9T=t{3az>>p9kK$X!F9fn^RdIXFGC5+_SuBiLt~Vf^1UJw1E^c2Nv^E;hW*l zR1o&TjFBPmQPhDr4TNXqRV?#M87g4e>wGEGkdctU5q90;0H4znX})Yf z*YP5VTG7&luj|d;0&Y>PM6MVD2^Chcy8_#M&r_j*r@*Q}*1cx5?0`P@oRg5R6_Rzi z!5HbL(SZ0;uR~!&dlk|B@>F0l7^)&1K8&2odc4my6va7*%1C=86&>}(R!nY zSS`qC;NB=wAkmu*>ukT(QX9GF-eyQQbYwEcTgFpb17ZR7SmFZo@NRtzWpUp*iQzm* zJ~=Du!LSZFH_noRmm&**#@L+uua=Z94yoRh5Nbeb(x0R>0}(8l%*dQnk2Qn|IUM#S zW5ERgb0YwTogQTjQ(}QvVu5ssHY9eS6HJ>!KR}^SG!*fN7=!_(tIF16^um>rBnyVz zH!+V`;^U~(WB#u13HipZ(J3)u5L@oq7( z9D?0g!IUB&s?AENXn`;lnUf76xeSO48%L}INEi+-p0yGFNW^2LWM*GUfXJ-K=X%0` z#jZeHDanQ76cd2Q@PrKF{+`l@3nhLNUd1NkUqLCtvfvw2i5ZKo@Y(jA)0ZH(+z<^b zp1m!p>Vmii34{Fmm4#ZD(#K8Q^F4zJxTJ{bQZ5II0wIk5(WVOo?W$6=%Q+z*lE@^` zp_)S^0UXssjV2`}EQgp36>v)w(JQLpx+9?_;BS#G-|!PCDTK5M?E}VYlf`aX(a;Hy zlp=jJm&^>Q{(ygr#|c6av!4(%De-P;-L|!YM4e34N>T^jNhB`ID37F^N6NDoPpTBZ z9xh`Fmx#bM60hJ>l7IpdH0cI~h0#V;4tXyF!WpX~AOMuiBN+9jwgWCB5pWs=qu?Wg6jI#N22$vdayGHUYVJ6sOGKRTh|Y_P#KXPy z0J3@56P+-X(fM$~IAaOvfLhpfypFqndfg@Y0mjQwCjLGOw_z!&uQW>RsyH6!Y z!&3GPv2%mu(}n_4HR&2kv$>@a3?l~sKzksnTy5-1z*bX5Aenslura1PAraz@2S>mn zr{YtR=MbI%45@{RRop;?h7nI63bJD|66}TO8Ri~1QOmO;@5!@K3D9F13)&9k;u$Y&3K$$E^_(@; zAizT?#3G`>(0XLdYzgeT#GeqUVV)tf70i{ij7b7Xkv*kP8ehRzqaqCsKj#V5w@_LU zdNR4uIl0P|GUxD;7k_BAhru0z5eoT1;&S#DbPz)HQaS;Kk;U#xE?2t1RBp5hz#(-P z4Ts_o_$Ibm;!|j36~#Uqi68qC29kn$UnmY~-#KwPGhABj5;MPlkwCp|jGP6=NWKOWQo69R36V zkyfygIZOD|+)kkUi%SNNgm1baOgp3acK^7@jG-4T!3B3vOJ;bOH!I ziEr>ps_@>=v*A>07rMw(W}pJ1VaqB{-qSG*d@DDsA!Db-g^49(&+s7+OH7dIn? zbzVv)f^s-8`iS?&$h}wFl8K}GiL~@`o~sd2SRYWpA>5M0TFw*BuOw^PDaZyfj1h(? zq$35Gj{%gpOe(f0x1}Z<1Q3yUbSumYYX9|y(Z4=(N<>WOM~WON!(8@OviJsZ47rDc5{U%?M4^#VX|TQ7 zYzxE&M`FehlNPb}L|gGgu;#Y!x!N1YiG|}yHVJocDU>IQMH=9nIzz-CTP?9U{Vc@o zT6`0U(co}Xo=rm@l3J1T#Ebz20FQ51yE-pO`Vx*6>T5d^S)_=79w;oDynVzU0(09} zZgUJ5DOw0bOT0osTqWsYYJA`<$LcKD4S;xxgrx9B{GruV?393%D0A}kTZsqbL=P#d ztrv1+WN!shqQ6&q-`*0Wb725yp`t}c<}Iyr@W2;#3>Qo&?zDg523*-#<6g{5oGfJ^ zAa~c61d1=I7eL-HXtF~jzzLQGF=}8;MXVsuHt8P%uwu*L5MDzqz2#w`l+l|_-YTO8 z7%RQRE8qz@7!_&(9F0PY$PP6Xj)9nVoIY$XQMNFGgs%yRoX1B(eobjdvz2&aK@T41 zG-L-_jz#7iMY!qqsz!SF_nkCPq#HkdEa4Qop&QK*@!*J7$x9c|4TzLwe}fdilM*7X z6MT2~ymWld@Cm3{hVjWrLeGMf1t?FQI{GO^MpAB5;hNyvT$3Fbr23Z@Uo@tB*>3v+ zN(d1e3A@;woFN9q!!=oa1<1pM=ps$P;fYT%*O?N5LzBpNsvBePV(v)PYtr+N|33@-e!AC0znz~ zleFt5kB+Tb$Q4jl2)bM(W(iV!NeTe&^)-<@GIIM$pOD=^I&d8~%uBN%Co}; zJ4EDI!4oH)vcddTds8&y-S?IO?U2M4t+2V-9Bm7yka9S{<05uf3Zf1I7QB>eS_qV$jv>df+;WPw{fWnK!Fli#SufBFr_Qlk4U{12HcR znZQ&x_&Ck>2wWji0_njAj%YA;V$btLc~ulXaT8(Lqi?|&@y+QF0PN^dD!U~fbF%N8 zsl+>UmfNziK}Stfkgle~T7z&!<`j+}++Dr~u$-s7H_>MR!$o<9NaTT2Ko$`m{Wf}) z3?KcOaD1^)oOEPPTz1TLO^|*~NuU*A!&eMwo49G2SYQt+(xFcY@Gsx0i_8fFoC-5f zGmNE95iby{Qc=*%^~PC>jf6!*1J}#kgK*z+`eu@TrL-tECmODW28PAo+!gkV{iWXs za1-%*WKKH%QTN2FZkU(sQ;OS4K9Q55+%Pth$|;fU?a1|vetNf1Cz`@O+vZ&evjvm<*8Sxpds_|1zIgdz>D3MU^FM7koyMgmcSD^fOpT}cpn)qXNWLxcV1 z#JcV|C)KxbKXSYRN^Qiah9!-)rV^^AY&DPQcxvBap@He3pf}bYT@9Inrl)WNW9+~Z z>;!Tafc5rNq$3qNUYhu}!1}vSg+d^JH%jv_Q5SMEe24@EOvO+ck-n1VQ2`<}dBvqZ zXuTeynJr#aOV2dSp4?9;e-z0$;^NZ5!J1AF`;*&(t9G(V@O3keT; zmPBlJwb1Qo_)Pe@iRkD*Sy327a~Svy5#2}2JpoVAcVu+%Q>E^z_4ok5!o&uV7>SzU zecw~q_%L`=pzg&t;mX0vAWp|yAs~!M0u{?#F`Uy)ewoftj#@F`YKXr;Tal44OlU^V z*^`_R9E@rNNNAW9S`1MV7a1v4GRi@CXLCj3Nm{`1C;wTJvx!CMI81oYUYZjx{w-~1 zU`pW$Q6*FZ*GJ~W7pFHE{>62XU!;3!BXxgfX^c!Bau0&F{N)a z!0(oeQSuQ0dQQV&SfU;s~N*oW&l2sqLp4JvO`n_!x=>{p{)^) z$ZDznAe`f3U$=t?)USP43y~HM7wr!=y_QH2k?f;85JVE1E5x*kAmID07D6Js!*^}A zp0RXcMrT6EhD;YjB52IB=X=6c*>kl-LZlev^AX%f4wS4qt=LiS4T<|K#sIH5c}Qmf zg`4+W&x=6T`Ircqwr$3ugic7*PTeYs*hc51-!Ih?G=0EGEEBWH2a_IZ`2Ge(nR)C~DEOkZjr8mm zW26R{#!f_t;Hfkxh^>~m4c8F#ZG&sBuDzo7l;u-6@WeM-6O9dz0#giOP?aHK9rzpz z99k47Md^$EgqAHt3=%y{hB>lYsP2SdWFNP;Y;~6=Dr*S=c+-2x?`jr@d?W$t7v29h z-Z&rHA_)%62@?P&OC+|Z@BgF*z(ByEpuOybFO`dnBTBX_>RZ%EPn9ouXTlitP|1@fVSs&B*mwjdXm0 zLR8W;WH}YO*O1|*)P__sUjvI|4@gBrM59WO!jMJZuCCC4hXBomzEWh(mK_o&oD=}{ zLXyFaohNVe6c zCAfLZoXk#(OiM1C7~-l=zu$`mDeES>z*&PwB=5Pt*Ajd}T7*fXnXPqL-I0ajW403f ziEv7+ASEp%O{qL{QbC_ZG&RIxn&nFE)5c~8@#d)Nkm!>Qirf_-I#LdNxB|wz?2xdZ z)_r{gtt|8*2rJj^2ueH#AC?|!_o7I?3(!ypAm1;dSwT#O5cfTIhzMiJP=L_MdqUfl z9+dRj25uq7+O0K7I6{(_ufuG;ROxk2^J!W`kwuFkE>uC$&{(>#ZF7-QjaNbc!0iC8 ziXfu6+%2?dVqCsgDBc?nSl5XUZpqSUA4=m!n?PkFX$;p3nhGTH-R}tn2rY*YNHM$k zU@#}SaqxIqEBvY0NU|std|g^zvS3306dDQH%m|t#pSYpP18cNPv`irk740;I0!$z; z5Q#b{`Q#%XB+>8LY^ld2849Z#+t5U`rVvJew_z1;{e-2!2b+tFL4i|jwXVXmrRIe` z!OQ(z-I*P(H(8bYzEs0%*RcaXWhA*P;pfPmg?|vaD-Vw(Vgex|IG1kKsO!jiKD1i! zBq_cJijeP=T=j9uds_41IVIAegOYH21e}aWJh|(A_ZAp}?>FILf<%a>rco5%ln^2s z4Oyaci`|s32L|%ki|$)(?WGU*1LrBZt5si9d3fYCP6ggH2T#e}CPqTFgJIDAhz@{| z$0K+Gao>ZhRq_ccSkH(O#wK^J{i82C?2gE4fxUpd$dFyP`vQ6z^bC@V z6qSf)ynJa3VH5%Y{VOALlH3z6J#DEsT2s)M7IQ3Js?t~;6rUK{_f&-QyWgo$p-p`Z z5D5+u?+MEU#DtbU(rG$ce;~C%d(H_b1%3?utrw;hIYQwkODM~?F+m<9d)r_y_xkz< zee)2PK<&YGC4mo2&-ti*B8~BrY2+i*{Uo1ogG@s9VVtPK*uCN|oB6DAZW7`%mxP{g z(D%7XlYZvUd)@c6zuY~#&u1M5CEs)pS<-vH6IAe|7u#;QXR_-^EckTpXXC+&Uc2rtV@I z54V4Od~$x#@wCV4TZdwrj`k#z#Au_R-7j+&#~E_rCZRVO<6@rF=1vEOi1Q$tHB9&pF(T5CqsWABKDH ze%}^pjz4=^r$;tBO7)wR-g}F-$2UCJojf~@w+?UqFp`ri+8=gnN5-_|~`l?5~<{y>a6e-}qQvJng^zUwqe(zx^|c*Z%dN z(1-8PhtGV=yT9ahKU%!zb=8Oe%VqG9_Zxoc_a6DTCm;IB*Z%Xr z{LybeJbdKv!yo;=um9>_{IZ|bm01OMt{yzc%mqp2xoEXJ7Ni&wBeC-<;q0=y!ko$q#*9_H#GB{!M@W z_Qy{?`3=AKJOAOY{OVi3_rL%A_kG(}f99|K%B#Nj-~F%u^t#XgtPlK;XMgLFkAD3h zyrTQe&->mt{C@e4JH;3Mv%mAfzx9^C@pVuA%g^}9FaDgfAN!&oz4O$^fAL?>Km6Pe zyz#ZK^55}|r$3(l-H-p9k9^yIdH-MhmS6cNZ+Q2=|IuIg+NZw%=}&&`Q(y77ANhd~ z=yUVVANvb`7=EVzr;q&hcfI1Tb>H+s^UAlq^YcIUJHP!Of9G?4{X2i^TONDE|M|!b Q{&}oC*K`}wcEapT78o_t614FCUn`S-K` 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 diff --git a/src/main/resources/assets/masterfulmachinery/textures/block/projector.png b/src/main/resources/assets/masterfulmachinery/textures/block/projector.png deleted file mode 100644 index ac161385d4e9fecef41d40b739ba601e1f3f8a48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 693 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 dx6f%FoTa{&$AvnVOzz@l%_y{{jX=W?ldQ diff --git a/src/main/resources/assets/masterfulmachinery/textures/gui/gui_large_gen.afdesign b/src/main/resources/assets/masterfulmachinery/textures/gui/gui_large_gen.afdesign deleted file mode 100644 index d1acdfac97af6b5c1318177ea40fb43ef0dac2ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60200 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 VBIoPRxQLy5_x$1awGqjA{{}wRbV>jK diff --git a/src/main/resources/assets/masterfulmachinery/textures/gui/gui_large_gen.png b/src/main/resources/assets/masterfulmachinery/textures/gui/gui_large_gen.png deleted file mode 100644 index b31bb3ff76556939bbf6b6f97d09e13f640aaa79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14992 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 diff --git a/src/main/resources/assets/masterfulmachinery/textures/gui/gui_large_jei.png b/src/main/resources/assets/masterfulmachinery/textures/gui/gui_large_jei.png deleted file mode 100644 index 4e725e02979996d00bb6bf83527891bfda0afe53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17040 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 diff --git a/src/main/resources/assets/masterfulmachinery/textures/gui/port_gui.png b/src/main/resources/assets/masterfulmachinery/textures/gui/port_gui.png deleted file mode 100644 index 04880aee6ed8200fcd204835088cc5e6927be299..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3221 zcmeHJZ9J6e8o%f9;2E-J9I4o4QX3Ve*dx1!hZ#yz+Rf&zur`f}hA8jML|$^x%PDmx zWmOb0mGLg7lCok5G2Vs-L*DW_G{fw(pU$VVAI|x5KJ@AS-@o5|UBBzPuj~3>{}ktg zd(~95RR92L4*RG-0)WFH4j@X{;d$nPA9i8*Qz*{{zkt`9XXvGbn*;G-{?)Q=Yci~G`+nEcJkhmtl|j4fTs=(}1VMZ1YDMF^ z?EJ9Uj&XU6@!qiAC+Obenz!GD-Ziw`^mVu4$BSVJQf`3d*67U>rbEmZo%;{9FWCj> z*6UqNqy75TM1Gz@TV2YQ_fPGQhac%;^RIC~N3=V6K78@vd^_%D{0%Ci!K0klI5lMW zA=CZRTX$)FT+G~~)V)`04{o4*z2WJHg%tNIMOz>GxBfIcY*^4MAMwvMFrfDx!_neO zA4z;hyDrdQJ*~+wE{KHE4a$woWaC%b=JQ6cC616`iPkNz@3?iko&gm3U0w4JwO1&) z0Y2!Ud>24jJ7BS4xT+3Fq2|Zr&L>Olk3|~FDYCil(1FHZ&XrEgM0IC>P z)xf>$ioVAQG-tT(72%Z zWM5xZ7+Z}wiSHNl@4PN!2zLZ?ucJ430)Zf$!C-vO?Gp&L=2ul!d2nOf)*Vt9XwLc} zQyM-u(v&;xAit(s9X^v2H9y+ABzm23Z8~(Nhpohua2nY1o-)QbCm&)#ERI+0xw6xJ z+rrP^7b^N`K3o1~4HSq^ZY>=NEQ9@En5kfs?SsR$eEJla#RNf0h?x-yXzSJ#{*3^d z0V`1vMqj=xI}1U)4WyRGOh5}?Dm{pTJqob476GWK3*Y14Mz2SdSxy>VLgDmR>gwhX zheMyKFhe)Bwm2#F*TnRYBW8zkch=6Hy{c;GUgNe8Xnv!Y8kfskUXG9~&4_Ze($mu` z2ZOp+7CXJ{_{-C;LUt5sZI7(yyG}#_Ys#@EGpL}FNOR$*BoaaEhmXX4n@K=Jjj|oi z!J^}qN5UF-gh_qbqQau#a0KHbT^1FBNUbJZTar5psHp{eNtc;mpV^v1LNXTg7Z+dt z;!9ur)r@qd?|7iga=}kbPlqKXCB4dETZ*k~SKVc|oT7Q}?~Tp8>Kx*?(zq#6Eg`;8 z{B!S0k=LrMI9x23iZaHcvO9LlVcOZ*MW+E^isUpn8B*r+#OQz_5;H4YV-~o|H^viF5QtkYFdq@#+z*J5<5Ixmb zbu>EGa)8dNzy-y|_B$y#&z=npZC6X8@GF!q^JQ({%|uA1jx`Xu=hAsERBg_kJ9iO; zg@xsflf`sO%2kKR7*IEJMB4R9fPV8{3}JL52}EYQ*=B3uaL$dJ zC*x6dY>_B5X+R|i!gSx_uLnmWMlzdhT|PGfP3C1-FOEwfBmNWvG_u`nvb8a@Cd0r4 z-Yf)pN0@F$j%*@<{0;Zh2(HIbV8rlKWYOVXzkQqFmzTP4a%L&+I$wlS(L z$mB`EE9*x3l(1}(*r#W4-|08aa9aYtbJoaKy4sq_}30xmwd8IBPOhhnI6o>JP`v7 zC*DTAeHH)Aurk10+}?fYd9u+ll8MBg6bbKES)&y1?_pqIU}_FIt+I7k*V#AXAS3Z` z2b`}#04`~5euxn^HP`26>5vQl?aG#cnVH}jzf(1Z?*nT(^)g(VS6+LtQq}J(d#aSL zEf@PdSk~$fDATOM@WyA)pI)#=hDy5&*7m7b%0mmg#Y!gyj*-Zc?tf8agsDrrPIzF4 zg7)1GQc?>A1@mZe0&0v+`gMnHWtJ`ml>hZDOeYdR$$@uP$UK1n$Sp=2ol}|M!HFx2 zHrYu`4^~umjMtCj#?^vF7ZZKQbx8TzE}~!$t_7X`%8F|Gc_+HWQOOQ@WPnEip@;6;RBgg`=> g0Qdg_0uh-W%XI!x;V|VMCU${?-9c)Rt@rsq0AevDBme*a diff --git a/src/main/resources/assets/masterfulmachinery/textures/gui/slot_parts.png b/src/main/resources/assets/masterfulmachinery/textures/gui/slot_parts.png deleted file mode 100644 index 51dd39fc8070eee883124054f25639bd61cabb76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3717 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 diff --git a/src/main/resources/assets/masterfulmachinery/textures/item/blueprint.png b/src/main/resources/assets/masterfulmachinery/textures/item/blueprint.png deleted file mode 100644 index 8d22f0c7f51010a9b0b310390769c1709006fecb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39974 zcmc(od$4EORo5G&5Q3yaK;%)#r2$Edr+c5h&pvzaYdWd(BttP_oD4}u9PvD7uIcXE zx%bW^5e0+@3P@S8AVon5q~b_fP#{5G#sCWVicy3TErM7GT7|+N6fXhsv(E3=ce*?G zw{z|ftDMSA`f>N!`|Q2;dVJS+t@Ae@dF|(Z?2A6-MOUs|`PheEQ$Nc8zeN81sE_2o zpZ@EA(D8pCedjfgpI*80F&{7ge%O_7`sPo%a^;);=+R?uJbUBApMN+U-@4X~$NhBe zxm$Pm=_^-W`ReEHbiuVny-uk8?j8|X%s)JWPcgO>7O=sP~bGL5ZK0SQy#?|Gyhx}Up`1;j@@JfB&Tn=ebzmf+&=xxyHBX6 z)8XXk&e_rN?E`sY*B?K9cH=55-MqrBJLiwReY)KyHthOy-JR>{H6^dK{NOm8|JvM7f}|3aCuw+0xkGCXv+xR~50%>d=)=e3(fpS4A59a5z&ZI*l^<$--;W~2V|Uhl z$R8eu!}<8+R>v6}-Rhp4uHU)+PN4Qc1hQ%G|57iCBfur zqNiMU&bl$rHm}S0`gnL+q*BIjF6ekX@QfFhmwMkTZO6n#E5#7yupDL>wd7{qqTziuy)~8uAxGeCTJS1tC`Ei``DbL5N2O<`SJccE8 zauIJ_#6*A`}dE3h`)c~ufOp25oe*V9*AIVw*PhLIJTL& zmOp#s=(*|U8|x!>=5(`&{NBHL{Qkc|0llzYcVE5WP)-rk)2(_cyC=85x_R`fi+5TX z+s`?tHIJ_2$oN%f`!R7-=JO%XQZwYQye^uFM{Jbd?q~U2IqeKGpz|ctnd5-vE}w=pnNyx< zQk8q_RzEAu$mBdEUEYVJA9Qn4q2Xf?``6BI*vS4cXPIOT_zo@*ES^6%&o~gp4I88PjZ|3 zIiEu}USeJB)imWk@gdI=Z{-|&Gbc9howK7+(-79KE3?Y$en7K?bWXg>c)d;!TsKmY>qWu@KkmQJ&Q!t0U{`XRCYT z#xbbX&q9A@1A5A(JVB?~grv<`GJ4ew-7u%q(5-&f+|Rxf1)8Zj=?3<`SJoxjs3t#j z*<{t~{j%JJj;W1sxIZoUmJM*GhKAIs- zQ*GDpSLao3yFBTqo^|!?mngwR&v}=3CJR%)dcSg16gs&}&=r%&*OUaWv1fytI_&F& zHCwx1xkh^i1j^!?CX+?JWCxR!cT`s8F7(6dXBp#DZ$>=l$#3Ky#l?Q17DwAuG@O?Jq-Assrm`VQsJ4bCB^M)#SVBX&qK;z6;u?YoCQU_|A!9 z@RLbKx#eEZJh~h5zO!~xe)Tze&o#;Pj5|4ua)elLKVc;MeD1WG5slTh!~0y11A3yD zJA`B7d5lNRs*amr!w|C7`{jL?&X#8xh0q9>SEb*Y`eT*5IZlPS0HM zKa|cv*JoiI@osXI7+cpTK^dKRV@>F@IZW$)Ip24x?=yu#^8shE+l!%WyD|C(bjUIP#B1VDV7L2$s1%3Jnlztm zzTT$wA+^DxY5E?4UDnlet&;(9uw(Ce?&|y4Pu`mWUv8ciVM2zU=qxb|*WKD~O0mSN zW8@*#4s{4bGU5_$>~=qEPC=n`%rtiE{nf!LTr4vo4gfExLiWq>j$G1!%Q%KEU9G={ zQDeh!oOw}=(~9lzSZjPaq`}xOo!0NynA#~DxQ}YGb26r4JAi4;|%R>$rm zzSo3_U`YmLk&YfkO*q+GHKV_J<@(jnBFr8%ZUaUPlrYC5z@`O@mqNHr;5X0fF@>3U zKVuO|I&*}ZJ0t)Y&b{x4DFwAy?dQyyGkuCc&G-*!X7oL-#E7`L$pXuS$*k6^bFPeH zlM}Qa4|hsWT#=YJkGAxU$XMVJpHu5r)gC> zZ(NlZRb8cNQB}4CyR3Aft597KVr+(Gg{||7&^)-hWteJ09n#u3tLy9{uYEHtuXUO)4hh7v`KwixJw?l(X~xY%~qGo0Tj+PMUJv>+kih`?l`y17Fk`Cs<6fK zZe@+Mv>CyQ1!pOC$zjfH;GNbPx!ow7P->!U{8iAd3xe2Xk+!I9)#O#%m>}uQv(>t(hObXlPi3ZK_abrCqS zyc-9t^0v%PtE^npk{zi*?=oAHLr5?1KbK)HMI=>|b6BbDq{qqgRa+ribw-|T$CeOk zkjC=4s|vMTQ=gWtt4wV(f|h*OHAN?Kvvr#_zFZEVW^X<6m9}2hVb{6w=6PyDqgro8 zl+k;ps2SMSjn!4NW0Ahd95*MloUiD~LZx*mc)h}es;G8dQ&~@;>yoR|EVH>b^Csi) zQ{=|(x~9JNO;zgJwWg3^WofgD3toiWq`cscMF#C!)jHE;ZIA;fYt&7uH!BYB7{o3e5<-5+U@D1=Oso~m~ zMYuG!L?fmZcURe+@75?&^JAJf+3aMUmMOwtS2Y@X*SQr9a#B~uxA`KIp=1v+<&6eO zuGB7>EK}d4+yYmm#bShmax$zSX@&{dWrR!XB(27a_(~R8rm8Kp33=t)w%K{#N*^5N zwzBq8nyci3B9xaMRw><>##-Ape%VRV-000(l|JLX?YcM^ihUMY0WzkoRiV6;HLVKq zmRfEmhb#^T8;fmgalcw5Vb{gMw<9>>uqvM~N`YX`JMrJNZgRit2GqDacuU4$xfjQ< zArFRQ+O%02TD{A|t84U3iA3STE?T+KMTLdSTJ1CR(vI8B3}w@h7;JnYvz6R$(SB)7 ziXt?-M7eIu3TLn}TxwAYK9neRQ)dkphg9m0*&577&f$qQT@)U-t~Mue@ifgcFF5fnFZ5!MmE*x&guGt#H4fUutZuesH0pWC8;AS?q+Ua1lCPj5s-j)@E z*jH~F{MoveSLP1wn61SnM&C3Rle>trszT#^5G~j=de`lqyP3R_pn)A(9D-O95~Bo* z#*APw0Qczy!0cUeg+jWV&aJAMM9v{azqU<-iZ5|mE-(czjAX~1ZY`7mIf_tlE(#kB zh??v6f}3|fGPSJ`0BY~r#UQkm^F>>vl_TL7F3`0vj3mdH@>3*Va&q+;>9oaE5&-$i z*$aTUog=Z1Vutdz$$zz7a}=*j`adRXXnV4D6%NI zyw1DoqOfV#NE|s;R=M}B@o1k5WN+ulkX5b1qbQ1s!2AMdZr8}7$OwJ0n!0WkMs58L zl|gH?Vu34as`?_}YuB7*NnB`xD^*j2LR?_e?ipD--zwvRS|pw;N0^wkxO=wBVsfh= zkUmbO%&MkPSfDmsa6!-Kd|)KVUI+@gtGPTl*^wQ3U?iSh+GYrCnq%ZlY;Sc_<6i@( zZ|_Q#W~lVSp{6ayC^Dx(=Y>W?Yr#Bm%MjYO&5f2|zxEfX^z-*L#O!4m3QvU3$O6!$ z2qntI)C3nX=`#=PE%%dst(dXR;2gzP`@l#}1wVz5rq;%}OUx;ErNF@_#4~NJE(pzD zc+dOi#3w57^0DfvvrN8zwLvsjC=~h^eP*L`7CGKMh94(T_Ex3%Wt?f5H4aIR%~>=h zp)vvQVrv7|1nj8gJaKSUO!sAbOG0MY43(P_cb`xY&L7c2frUf3$lym-o8={x5?o=A zyh?DQO-owPVyW=+q9gA=6&PU{mBIs^v=_q&=jTama-UtPOJrW7#1QvZU*P-f8oAtT z0^k;u$NDyA%O02$NT4DN$4?9v_c?Ydq!#a6ts|MrQd90ajz>(JJUCJ;5^|fiDlhR) zBd7A+!=+^EsD#GWQXc9BhKWKp>-pY z;D9r-1_&-Elof44{E$};rKwt?o!H0+c8K@Hp*N)>N@`WiI=K5sA~powwsE|z=!M9f zcv^%*h6wwzy3gM~r$-Ngj1~q>T@xY2=6qnJyeA4wJSuU<){hh`2oMFQCFCIVG2Mr# z-KU4pCXF`0u)Yn&McDGW)+}3~MqC23^}!7OKSS_VYJBRL+}3!ACD0*RfCZGuY!k@1 zz~U)P8TA<1K=GQ|)`vxgI3j#7(U^@QQ4`srrshh8+O~d?J}~&IA`T2G?n#}+q_5S6 zfEH$!-r#ej&r0$xWEUV-N4+<^2-^aINsPoU2ee)TR#Sl45&XpN%1Cb3IF)DvDFe?T^11OE<#yLuUJ%3jyl@dM#t&+($^y;2yeq>nWh5*# zejMK2?)^GM@AUuO$gY9ELD<6>~ zSdB`9I6=t)kZAv~Xm^z{3kt3z3m+u^n=R_r{T7+D0C$y(vNs6kbgN4ok=mfl$^S zhmo}sV8#3s4zQ^*&}4%<%*bFWhcQAL3WCBsqUTdoD^P!pm@YUo8N;&9S$_b20qKwI zE$&Nhcsd&-cDrx^><0ANkVyn3jEt;+Eb^?8#Kj^BO-b~MDBv()e`Dua@T+32E?PPa1SntONkx83gw00%vpxUwQMz@ zHyC&m*&!0~Kw+X#@&!}CS_BvgNH2IVI)C?Sby^58Sc0OV8`z<`C^!*_Yq=`PkjF;0 z{b`_5@p7EHR3jXuI6pGJFoQUmT|k1QD^3q{IMp(9@(e#5x!)`GKOW zNx9)JL?nSgIZc7GB^AVbdXWh$jt!1q6w%V84;6Wxg(V>)ag7AZC!^E=s>kNUAwX|{ zZ;SPmy_E{A6xW7oF~YORYD3XNRwwrdx+L#O@|f3a#ktABreY)aJ{5dQMPjxzU?-x7 zNIlosMN+F`CStb?j)m}emVi}8f=Xf%iI@uqRvz)B*!g`=rDBn-YVa@?PZhC~xD}jQ zbKhc79eL@p#hI02Rl&!_dn>p637cObN7CVrsigo z995dgAc98VsJRBHxT*AJZ?m>64BV!Y04t4o7(^HVrvMh*&_z=-8HgO|Mp!YJjNN;S z=qUd1-qBpRHRQ`syRkWOeGI7ra8S8rMcr1^`4r^I5auE_Qp!l0 zfc>l%4Hj?{@xpP!$QqXy74Y1R>P*_Qv0%<{Zx-JKCQ4N^lFUraDk7`Z%G(NtM3yh7 z0%HJo8UqM?LPcieeuC}6k%4#Ak|UM-iBTlx^(2>oZ9>HFGl0uBMT)q_%MOuPsR#Qol50`o(HW6{)j=XC)|qH(-P#Mgv1M%_<_l)_b$Q-LEzn2t+R6&W?* z5lMjhrAZ$V(QP~_4eVQy2!K_D^u^AzKnw^~vH07YO_nXySy@ql2{SA*XBk|Uc`{Xi z3G$xoEjkqOw@_sA=tuzV3f5A(^-={z117}ppnfrifRGQN(w?AI5CXZ`L_H-`K9ynw zagZact>JD^MO#_lEOJ|cGf9-zcpe$U!bEHvW`IYzSO>`^l?p-wI0J$eyPtsBc?H7P zVqrvXS7(F_={#H!XlxrStRUEDwGPgJg!r*J+kH=kByukNA~GwB?gI?~n4(O`lVZ;5 z$lhXN@iOs>!P772Cr||CN%gC&B(xTaM<4`Ig;Rye$!A97HY4M|->D$4slybs#OaGp zfCaHm;vpL4sAafwdXx2sd_!zTZjeHdG>`aTfFpZK0v8xw7Kv75ZIN3tuuT?PpGj(3 z#ZH9`gNAk|jR{2hpr~n&Un8uRoK)uSy8;&FF&`zpeKM;tWCrZ4ORbTSv5J274JAAWd(!dI%&I z43@m9W7jSsb>Fqw8O=5JTrB|yh?#J-H}NOXB+PdUoFEm&5f3ASz_F(!xV(lejBf(z zNHlfca;L#Qv{2m2NYs(x5$GD=zTEDuWG$!-fJ}!0&LZ{`P>E7Wln0TK=mfai*l~r19I^HoBb#9n@W?M|%NWUvTAOnA%MQUu1XF;$ z1lR}JFtXYJDv48(L5*0nNm)=7CdqJOLJ)=6NaAz$$3jS7ZZ;G(2ntXQ@%mIOdrGp( zG&lx?pqn`<_9|gNLGePC>j);#$bCdHu0Wkl3q#^N!OMFIjWArnGvj%6~f(tt_aWD)_QZ;RBxX>PEhrILz( z-S3Hlqht^C(}343bK-}?B_RccJ9kk5=UqKyRjbfq72e;5*~OC@(0tZX6M#peDw2@dfLjzRkt>EkLWNcAuD~|m^HeC{DX=P#buSq$TcD3U=OpB7g=AfB zFh;s*G$6jz>rmLxUPN?1KNXk^nyLtk4lTgwBG0; zRtqv3xHpOvNc3jII@@ox)JE>Pw>i=c9hpq=mhqI;fLK61hPVJdyj$NwS=@I{VmJ?y zPtJ;ZFsy^)#u-xZQe*+p7@Kqd)soW1Ax$?Wgef33=}%IcG?^>NWJczsdaNN#aB$d{ zj0G0}%#8pTc6yXCOo;_vi2>3f+K||RPB5*5et<%uXeiiz)mBZ7!@hx_eik%fTW7a3dSD_?lQ5BDIuz3!mhoI;FJRC2#Jk1B zatLN)1v83#s5UF5q6NZKWKK4O=>QiiS>r zq!jawEfbbiz`w=g1fhu8Pl%b6c(=4}+gd@QPNr%lsRQpM5|`zaM^ers<=KlTRf=B^ zmobA&MBo~USMVuGKmiHrY=gqWXrn5Jyq5;yj8zd307~W&jCxbs0hf^oIFKRYazi7J z+-$)z& zWzP^hH%LBhC?HjnuAwxWTN=SI8~^~?15xE_V^;#UnkoXxF|lMuV&tDe#o}pj8OaV;KwD4mk0Q7d8b9j*@!LnraZ> zArxW}(O_sjGG?X(c3t96h}1C85ZMamN>;`sfuzWu(kG3t;Hy!Q28W;X1nOHTtq47t z+~}NKWlEVHyyV3nTJ2$QM_`0Pevr7Fy#*bF5WSR6fMMjZyW-?Z7nsV8HUT)K?xNvP zECS!eR!e*ejjW>BXCv`sqq)--zF&@a7SWonfDo0Hne+i!R?8B~($km&I7H7(oDm?^A!JY#sK@HQZ-)-AYk9n%RQ_$0o; zC#k}h)zTD!qFrf_j75$iXjG~|BSp_sE-Z7B1cFnI`sGw$$j07N02e}g&Srz!t>zk& zcG_3s8OdwWV})=7gd1sE8GnL>3W{!1n7_g|k&Gg5$eB`o)x^*&PJ`N11$S{XQv9J( zG7*%+fze02H%9Kg+LlZl)la0Qm-AeWh{F1S0uJGpB-V1CaDF9O%T7Tyh+&K{L?In1 zzCjeZ)!CWe{8kH=Jc}=w`=iD zBu0b7O?fsAc}QwS&J!~R6aYNFUG3_;An8juR;aJ-NMw;B0(zjZX!7g4*h?aPTg1Ac3!_@e|S&r3Nup0pJ6bVV;jrc>WtJo<4DN*L+>9-OO#)%$MR9i3P z$jIIbq(pzO?4G?PNaw-;&O$|tj&v=pbMU|yb_^FxDDJd>;RamTSmSQYOPnlaARu>_ zmIR6~sTV-rFle$vB)|!l1u<%1Ohv39&^GBG07 z#4F$lI2aXb0UV7&i^vW&6^?5L97VY4_NqpD`1hSOPox_^eJtS=+Myfu5b@xMR>?~j&<%)`Wq*SdzmpOot`mHB z_q=p`&hZJTS%&e+NJ7tolm#eHomu)RMMhF?Q{kH6+gy?z7^M1_7GE@`d%(vM)6$2eGpn6RY{OOWlr+y7|#@B!vR=-0MpscVy)Dl|CW6fpp+HZkU&PK~87_gk0egMs|qE zv4ST~I%TLlRrG!scdkv@M)M%HaTyi`ZQ$h&l*Z@KP>mA&AQ1 zjsa}a)M$}Dkv({H95CtdSgk)zF+sG+#%KV2?g~yD)Jxs4XsU2xEM)?eOt23qJev+$ z1&l~YDAGv*4=W}^l&woj8EdqOL07Zuf$Jzf#mfa}-mG>l;!N?1FxP-iE}H`l#Jn_Q z0#n`K<22hNaD_w(qz4~3qQTgSJX1Yu%kz*?3Q@U$-Z-D z67SGiZp+379o0=ix|$Aa4Z;nfmVPGUooI<;-+O{fjy*1hdw31zkI7MGA9ghD$G31 zFqS$+yg;lQXeNTX5Y@o({TBI*foYdspF@R&h(ulr=%fIh=LZ_x!Lem#^+qn}@ zfmUG(3@^jYj_fUDH9`F0H!oHYiZr+?oP1Ca>53E^2}B95NZI^lB|+#_`^gXu4fdN8 z>$>NhRNun=aCilj+K5jLOB!oUB~(q>s*C7&YTsd@f$5;2H`X3q4Vi+br*H#f?7$N2 z1acOD_4ZVxBNaMcn)tTB`nyksLLh)QO7qWA7jiRvhy(>p#ZVcMzLMrq0U|Vc#ic%I zy&j^OEnZYh&os=Q+)pTf6v;uj$D^V=Ahuf83$9K=@Lc+Y4+in21nG{%f+W88l>}*o zOj?`fTT5Ly-#zw-Xp*t~OPT8ROa1?Mm9pMs*=~$nzlKt89u8^kSO3(uSve7d4dEdPS zdf#)03QG5=c;RYXvS$~r8tFvfY}z+2J~i+vrV}Uvj5~7?4+BZxd(OSj6RW%DT>&M; zdZDs5cLlYQHG=fe9|1x@#2+FeLh9&#M1B3DZ^;b;G*OIBGgES45xE5!qJ;qE=-X3) zM~&|QJV_KyZag+}?>T9AK)*j@g_^j zNTQL@1F&)TYK2z}^aO7ae1hz)$x zNSbcPvQX0BnYP!gZaJRk4*)DoY!Hc&s2Se( zJ%x=AgEs@}UVIa-9IOoDbi5S;!iXeLvCI|2Io;%!=?rD56$7q@_zScZ841ILX5^eb z$r-`Hs78Q z6rK=OLN#!GWKMi>dV}F#To(C7x|cRm_h$Ik)j{D&KyqS>G$@uxA0aS6DzH2WN=i~A ztA*@D+<>oFZ8*3s&WVT*oe9wVF&U!A5`-MGkCX+84~A2P;PM819swDN%t?(YeVYM( zw_J>pj{wkf8U`Exi{(2YjgX+D=Ll6Vi#A!!7^X4<@QD5cW1cpsg|JW14d%eU^J_sWeyz}xOlNnq!cXC zr;V%}hblUr$V$FON2fYG6p)|Ya$AFF((MX;a9KtLA2uRfLgaA`#VKsvG|kdjpPi;r+ccI*7bMd(>o-eXlM&pRBkqn z3aKW^_?|Kym^iP+ zt2zkpksSi$g`-8EL!b=tjFG063<*q8oR3)dQ`!PkJ4Y*j=@ljtj~7_tY65@2(2B(? z(((<;0A3JuN#^9IS4PWtP24EBmq^kwXM>f8XN@~Ww#-W?_yUEf zq-n@K_KDYtUjFE;Nu)L>a#>rMt zO9!IwBR(}HgVM@BP0<80=lTwHeEiGeC~#rWCX9ryKu2UMA^5r*{m~-&md1B9Zp19X z&0FSVc3NZ_a@oWX7k&EuZY)SyH_-*o8ayI-&-J~Q;1kj!Od8E>t;6b$EEFHJmEcc= zQ(^@vX(4G!<(ZWV`aGhkAr{jtS8AU&HamznM^%SJpKMU%t^m=Ia^S-iFy3W{g#EPc z>ldrzsR*0(pT* z)IrH7ANe4Oe%EG8JtoOeSl!r$CZaWkFao>{t9a`tECoK;TwDwaoMNlB6`n0MFZ2ms z?&s>x>~Ouws@(IX8dkfG9r!^b$z2IQNA4{AgUDTZa3m2E2ob@#bgM>PN6zzs)q*EU z@jXz4e5d51k4xUwnh(w?kq#Y{gxe$FWJKc0UGKZMzz}@D2@ew_LNqmvqWGqS5YcGJ z5|vx*rhGjxkjGwh-)d_weYo#CPsv@a`kKmvBQJ3(@TNI5~>{xgZ4*s0E9dq z!4ru4?q98vPf)>nMwBo%u~T_qg{V_dvUoK%)g)MEVNYrI2eb z|GgQ=RrkH;B~}Ylm;UNfD8>^|fdCUE!1(ANec54mL{{AB?6Tb#(9@u2kX)pw zL_Fi=OIrw|5CG_38JUyho^a`DOTE#Wg1)qvW9d?r#p>SKUN zaEN$MSSBDQwDgfq)6x0^sSVn5PBW9V0#F6?gf}XO*2!h|g>idcHy5 zJDnx{%%AsZ-_!nb_vqfuX&97z(>>%#@A;B+h@h? zVLClKJ~`#DF(?l|eE6Cp`Tbk?y$pQa^yclaZXO++o;A;$9d^Un(edpYSBI0SJDbL< z+dn?KeR|gMw1?^&SH(0P@i}h#72#g;B|PACmP)plrRE_?yUdSl@s#K1G6E_YTWcQ|x)5+02GH|b) zoiE{Fk+}ai^L=QE>qjI^yQJ$>ngE?<3Ef}PL{GWyfHg-t8UBAbq(x6{)Xnt=HPPnx z^=2nqxt*tHk52R9g*s=Y49fU%s|7`8EmvCp1if{Bu@7}RO=&vh3H(i;gh4h7^`59c z(?c32;KWWgOP+Roa`fcU?e6AX-FjCOj%zicXscx#>gjYiIl3e2=I$RoTDS7c=MLEm z^i;=hUj5viZg|slb}-%M-kw~2^{c+)9l!C`D_1`3#~-ST$Nbm5>+P?8>f^gl`iU?7 zwRio=k9huzuKmkzdGVKj<=_5{qwjs$M_+sV@TIWYC7q5TWYhV1t;otcAmk!~7y!1~We!_o#_op3xk?jKmF4$`8z*&<@uj_^q2nC>;BlE z{UhJ{?fu97=sP~=nSXfem&R}WhVJ^1DC z`mJyOm3QBI^LM}Z>%Q#^{?qrJeAd7DtiSlq`uWGl|Me|j@ciRn`(f|=*01>eTaUi& zo4)#WM=$@JAO70k{gLh$r*C-Qw|wT6m(C~iN4)1x{Pq*CfBpB5>VJOkmDl{jvp@3> z9(m{Y{p5H4$eaG|m7o2&@Iz0(>QjI72mY!5j8}f(kAK-$z5n?uKlUG^5;J9+y3C6z31m%@#xz=+onh#vzpNE>)*56hBrN91v0XWv8 ArvLx| diff --git a/src/main/resources/assets/masterfulmachinery/textures/item/scanning_tool.png b/src/main/resources/assets/masterfulmachinery/textures/item/scanning_tool.png deleted file mode 100644 index 067daa9dd52cf5153e5dfceae80dea80f9cfd013..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39973 zcmc(o35;ghRo|Ng#q1fD;6;vHDks90{kq?~%e(hh+#bEv9z#2$@epjw1m5=bl%~6@ zTvfA}5EeTSV?YT@0s*4{5(yF^WW^AOEX4>bB7z76B0|Ig5)nngR%8^#fynut_kC5< z-LCKY)kma^JmX&KzI)%j=bq(%{^z`Jd;HCB`25d#+2>rlcJ1>Ydt?0s|Nn^m`&oa6 z|GwhmpX~U*&pv+R+fJ`t``j;WB>)BgxeZ|3WboY8U9`)1p z=kFf#)7P%O?$PIuyW#2SY_FegAKtsU|FNI@;Qrp>cys@&?5*_HaWy@4_{Oh0ncnhs zZ+>$4x~GRQ?mznaz1KZ|zyt11XWicOckkRgJ$U}+{`}knel34|V}Eb{k+Y|7?iVuQ z-dk@yzE>TcOndqDG#Sz~-*e%5mK$gFYxh*DvKy(ok=Z264y-!J^xo#5eP%luR|ikj z?Pe~1cXR)#v$Nxa8#kVN?z!vF>FY-)w{K)21bK#12|tmXzU$su_k42i^p)pNsHfB6 znC?t>r+a6o{A_mdv&T;zogJM%b+qNt7k~Z01Z?fCTNiU&x|X|lFQzy>Yo6sb zHXCy3PoF;duH)&(6VvI@Gbh8;Jj*g)dHy!1XHQHo?B{~v{P@M-v%}SvvGO+$ywvpk z;g%njzq$C)duZ%o;*6bb1plNpYP(HQrFYHSAEstz47R|(^tzoYz9nqcQ)PJ zN08Da&66xVnYsh34@`JXst(e0{iC;z#>3USE`BsiQUuP)kEZ!S`rwZu#bbBYecB%$ zhlAD8$=!}KIK124o^Bl9yS=}6ak2;1(Ve3cCT4Z|{y%@LsvbW%S{>fuFHWC$L%H`@ zQ{`F6^F&?G=H=eHb@14|)3fg0Fg;e^+~-}dA0Cdp(%7x0UL|@QTrzaVB%PgxBr|rj zI?GpXoX*GBN5eBBl`?*PLC2$kXS}ey&S;aG&?mhQT+EfxNuQ6N=VrdMdYVk`&Y$*| zPY%%$-JScNDytfKqRR7Jd7UNJXC@h(2}xMxA;~)9$8pN1JRkS>L@W+?3`^?dBHrBR zRp&o^tBB{FXV!n{RLVa$GWqZ3@89-m{{Dr({>poYoQ2xo6Tw<<|69;;Y%_DsfA;v{ z^V6NT)`#rO>3R|Q{eSbe2mb~I^ul(Xzk0!;oFb;D8}(Fnw>Q7KbNKqpcRJO!U*(+E zYII!^^n7mpn7GOKe8^3vhx~OnL^JV-wbI-EET5-NIh}N!$`hlEs-!i_0nf$sSavDhC-i(WDKm!XCX^g8Bf$%ntSUO zKP#;K)USr5%lnY@BTw~RJ|Xr#%e3zML9LcPOWC1MGv$%aTqmp4sD!l*iAsA6P}(^k z7Vno%bvJr7CFz)ti3%o9y!SToDjP>0s=Ad~x-Oj!)+-y5X~nI{JD%04sZVm7`BlCO z-FSs{u~*ZS`^1ObB;Lw7_Ij1rym!uyI-Q2FbX~@#UiE`XLdaH$cZS#N)WDS<(rn;d zLT490%S~)lk8q}_nT$;mT{9#rz3QCNowvSU{476ZgJU7CSED?uM^;DH)vv7TwHwEf zE`Cv%KS?*mvSe2;3Wr?3yVTWNzEQcAo-sq6|rR%bGWmm>@iAhsbvod4iQ@kwQxh{1p z6HGcSewKIHD#x|rp;_Wmu@p+1#F#YLVU-WcEj~xv*&ZR#Jf_Py$B8>+SG=gnM?GX& zrtI?l>U^5pE>HTYXI(w}B}y<+tGvrQZNk(q-me@LW&5#9&=r%&*OUaWuxCR$byKb; ztl852$`#r(AW#<9G?^^&B|C_n&d1cIxeNWU_*q)}%|Ibw&DS)nIfikqSo2fg?m zSIYR{c|xDfdIHTqs0(M`tcw%vkp2V-LB#NMlwN$dou8&@ zH7gk|$_5JGy{(l&3w4!Oi*$FDd9g8M0ueRo?~Wv!%~M9DL_Q zG5AR*qug?@Ry?{J^1icnO8w$<^qy;C)G9Gy8084D;C{kL_W7z)=?c+UY&*Qq)i|Ih zdbvY5HlD|L)NI;u6KoiQS-fA~ciGDFES;kCXZi9jSIKG^d$$_GlrPu!J{YTUQxm6F zT<|}U&Oz7XhL3nRIZBMJ>ywabm3VD+=*=oj%Y8ZDcWK|76obfNYSeY&P39BC9rI*W z?ys<4LqBzW>J#HK3<%CUx^T!7>v*Ds2YtU-NBh;7>KwliHHIbg;;$-AcoNWTDL0dw zzf@L3nk#hckmxXG+(PV7kYx^o9mi}^sa-99mO|-dxP(SwaJk#)i3wMDNITsboJIV( z#p|*@^&@-VD}*1r&9A%*NuF^T@z>RKg=gjX&en5qmRmTltM5mf^n=Ie@%RVnV%rg1 zsz&SbBxC_;Pf@8o3KciecEPSDuk`X~1@UpU#i<+wU*R_4lk@0~Kj<}PZCY$Q!svqT zY)+VfB#gcIm}563&J6e_)?kVj>wD~St}XF8wpQ-;pTyR7ZqU<8Bln@7?KXN<^=UG8 z7__uk*7S>g@~$6-)fljf1OBSvjgpYdiSmxA_ZjZQV!hgpeK2aky_E1}6rVg;#ZmN_ zT+^>IuESDU?XC7;T*MtB3GA2X9HPIKnfes*~4I$$&W6vG+W8@qO$k@AZH$w_2ry2?jj@2!YSk-Uma|Ui=`*TL80^wac!@8M=oi=WgJ77 zE!JPdsIXx;&b+9?X~lMUtTnzI(x7dZP0ROd%4;|% z7RT-*zSo3_U`ZNfkpWJ11L0(E(-r!wPhG$GS%lex!fn8affD9;1lY7-@lpu43H(;8 z<(R^Xc;B#yBwKNW>pLU>7|y-#hbaTKSnTJljMIIFK&|i}(9Gz2T!|5JbCU&@36ox| zS66weQ#Lt4>+wJ$QgpQQL`I;5qvdgSvHn^)0IMOxXL6%Xa@0JRQW5wWJl{S=WctN- zoAdW!jTfZ7%cL z*TeE!WofO8wlZ~-5yNTa^Bl-km3hdDPrXp8t!@7L_Z(@-9)o^CDHY(=eSinQses#pBkhwwbQk>T*7S!nvl%QTA;c@aM}d=VokS z>Y_{wTg>lP)<{ch2v#gOOR-HRjZ14+d6Q~i%1#z#ux(qldB}NCwN1E8@V?I3>flou z78=Xkwsdt+X^~&z49+`gII$ANtxVp|Hz1@{<0}3sovJVMZP&w^tj(*^7$BY6u}E8` zp)gh2Rv|F&mMyVJQH95IMVUm7tHOhKTBqf9qi{m0h_3NhLAx#qV&_HLqPA6&S8bz% zyc_!!L49GTyZgHH3d%ypYuxuzvMQiI+ZTa!b`F7ZF-VJ<@?(QL}{g$`9wZM&wjoDnvZ<>uV&r{wtuPT1qmfMcI(1;K!@ru{9@EQ7Eb0as4tje}&Yc5eiRF!W#x578T zr=*5!t!Lp<*b;@9R@~jxZhf~V)ipn+c$4)`)>)Y${B>2Mp|_n|(I6*vrG1;vG8szt z5L4bLkmM@eCX;36n~YoFimaH8a7djDD@dAQ0=609(mF}2@glyGMV49G7D|V_@@?B} zy>F!t4s%;sdnL_PazPQws}8GD)#%1r+ctjQNz&Zt%{nc;;l6FVI2eju7Fhu@X01&_ zc_nLF72++m+)NHx91J!V+t%WKwMfFYi-T`RaKvF%KA)8W!JK#EzbVz^e%lSGad+^R zw8nDJj$uO{49B!-O&MCX&BLo}^h}9F;lj>Zxlu)hg)^=42EDZ9b~8iSG$aNaU&w4F z_gl1IR+FL#%{Ec4+p@wLY&4fzl!6Z>N?q5c!Qzlg-7;H)*~mFOv8J=a#RAwC zyS(kbHF;C#t;=u?X3gc>rmk&+8^ndf&Db_uqq(6T)yD0fO+Fx;Y75-V##UP$j8iT$?0>fm-snb zN47+fMakuL-c^@{P1{D|$faeKd*5o0_PIp%wvG&@YEwLlqNoVWFLCC!jVua7=!?}< zb(><;mhVs*ltL>OxT3nMF9W`|%~_Vjg*v!0ZE8@6OKjSGBWvf|RJ)MQ63>+*Of)U- zo~=wwZq-B5$ElR2YKjyK)P_qg=*655jRe^XAw}+LE)Pz2WQQIaiD#F!2BFPzjGT_` zt!irgYvA5k-D+%^%e~C)Jcu!5tUY4Qo zMEHy>08NTeqD*v6a1oO}{m|ZWKiSuc8CwJAD7M;%Msh0nDTFk&(#~CBPPr=u4n85C zZtL`t(Cmfxd~i;Dq5>};tDZT_4%0Cg7cIZNQp<9krY%4sIILeP(A#Fq+Lsb6w)@6AF5K9#jby4&fq$A6c!* zODH9{!X9~*;6&+`w4lXO;pat1K6olH!Z0d@2RdmlhY>E$li1_|yHc0Pyh4c~?yb7S z_t`dbzS#u8EhvxmZOoQEG$)WiMHr5s7%c8{>{LiCKCoIxGL@xf+;tp}m^OKMq*x^6 zHfz(o#5;|g%EKekCbbJ709?-|#B{>LBN0Tx5R^)73gXb^bFQ^!ZV6q$j;ol&KQ!k& z(iNJx1#Bv+6D}D^&~Gv@8}PT7U3qwNyVmI5eGThU&@lGTjuQ_Y5DuLLL zxICs!@`ogWQ$hFQn2_*yDrUDxs!Kzh z$t6SUMkK)jXP5>EE+>=~Z9@EzR}Q6_wnRIzkq_+?NZ743omM^qs*#b4<66lQ&rt$w7g11uRQ^(}C#zQQD4#@({ zpoFnaAmajyr_g28V`KxxYie5`W*Op$@WDi5HYtgk$PP6%S1Q!D^|SPW!B-V=V90P! zY7>*bR%rrSm|1F#&yhYW$-9tUfLI;%-tZ!93j`)H61yDGdJR}j0cJ<=6T2%TxmoSf zL}^GFaDGVKLYzugZZ(m(9igK{WH(EF%_f0-uDwRN-L=UJVpyLSE~3TwL8a2NKr_$p z$}mhB2@8cEhj+Jqe=`zZf%sUds+{9N>r~YO(psQ%V$8@$+yVfR5+nhlB6$@E&mh=f z`xwy5N8|`rW2!)$pyU9^G=k_Nf!2x^LjiHUSq6wW$+g&=!PkH@@H71EksF&8j*J+1ctL6*G7>H);BZ+5$h`zQ zg#?0LH4fN=TGjYQFvQ`4Dn18|nHkAQQ*0{rr47zd{Bc!1qD9j^zK0~zv_1B2$j5CulEbE;0 z2jCZw{>a|qzT}#xvq56F3m3p{K%X_4L{P%W$O_0JH;p7NW=UvDqE|!#hXMN=JI^X_ z3-$zPrk(xjjJs)k0U!zP7GkTdf^%dg1l683XF!8-eFAWzBixCsw%&QQHOtL``7+WP zvO`*vK+q%-vENbKLSje~Y~-^xG6d>EYO(et`&zKS*lHUPkE+5wxFRkkb^t4s7k)iw z85-BJ)qvh$;7w$QNW=q$i9*R|OaW^VU?d>D;JxVl?WiiU1rhw7r>L?Eu^ zX-S4WHnJt3)wT?nWe9(oI|B0nYlCr&SS6*11M$Bl###f7oC-)Irm-N!6I(3?DQ|dF z$=_+YWxOH;&|2BDsPc#g13=n!PF<6ODT1IoSJQpOjRK)#{ZQ^=Lt$_`QF8p%rz8CrB1+gq~4C~BhZa(&D2Immu-oGuVV#72@51JFTFlhP3D zpq1nYin1o(mc zB6bqDf>SH*TP&(0FI~1cvr?=o__%m)1^34ZHcyr?vbSVjc9bF1*N%6k*?CR^c|m5* z@26;LZZ^r$R1q0O&LvtHYcu+CRG3qDz~ht+lo4$f;<_* zT*O978A%hcpVh3v0&XH+I8GQ@Ib(P@AwZC95dHM1EJ| z4LH^KeK4*f-nhmh?RYAlJew~tKO{J2O^tV67my?x$BRUKO;}^p{TQSau9}<*94W$d zT$-vdX$)P$`c;bb5fRk&!eh2l7F$9Esh$7^}jt~LJ%_iz8 zq4K2}Mi2)%vf3K%2353`_024|6*!YbX^rQRF)U2PwqXW%l(Th^TvC}rXaHwGuwwTU zFgve6_*yKC$nD~ckS3jnD*}yejfE8i`>fW%8ITY^HfOu*sgOj@gy(?5xF&F{C7JQ2$JOy9}IA0M@f)w5N#mQimc6YO9r+v zq4h>m(`oEf$S^2qchZ&o zcYaS?0+=Y+vo+>Nu0t2t>J%-M0{KK%3sIEN3eRujy@5D`5J8)R)7I9JxXi#_h6YH} zn~fdHUKgm2G~UGC!i9gk|+-%Bhd+P zx3S@pJiuaL3?t_$?v@RtLD!N11B?5KZv>D>dO2e4F-F#45%9>bXv-MMi&~p;_VW(G zM+8%Vy#&|?*)X!&04j-7VW39L+N3Nf3X^0wF(HUTY$WkH`(q)b&o>*28UzKXhIoBx zEPG0_N;fzLgrMs=DfTL1KSA+Amg@*6&&XX*rPz6gDxy{(T-tHWh$tsXp++Eg2S*P- zEV4r&c00bOFnf1873#`JR~aH|Fk|r;$sz#(mXHadHpeoVHdTO0++-2~qHl{#!)b1? zqGc)-0o&gb1xLvq=%)s+ndih0hf6{V3U}_Z0?ufRL^c-G21f)8~m4fv~j86Knv2%q41r7iZlu7WkR>cq(KoSsYj6q$m^D7mY zF@ZM#9NQj4xGfl_APQ}IRXz{Ab^LVO zUn?Z*a*Z+4O``$vrCx`^hW0X|`^BliWKdK^SbP{cmF0M!Z77Pf7Ri0#RF-))7BfbE z1)}v@53yR1(ZIb)Nr6OfHmtMVR!eQe0jn=;7`97RutT za}vXOkbH7h)PrFi95+srf|nu-fX3LIyRVj%E)Hq7E+NbSsY!p5(hNkfWHKXjQa#oX zCOA0kbH;)T0Om#j3_Cr_7^cJmuS5gs5N$~8Kqr{iK|esDP&5?rhZuwbrK`%uWAwt6 zk|Ya;+&3|gQA#V|y-|g*o)aje#>EtVg3^~(9G%}4=yI@#0NlvN%)Ta8hDa^r-ohuj ztPbmiku|7NaJIq+llRQ<1i@0sNRq_W5nD#no|?4+qCo-|Nnmmy7{(EZu!_j3zzf*% zJ@IZau^fV4TR}sS57lO+RJ1^tip(~)fZ47v!r)45y@6a_*U|D#P82-;<(Xcu!r zJ|vMzphGo>NCG&jhZ;>vN>~mt87knGq(rZ%f~$^%mVm!Sx_r$~prjDeCbSP2t4$ue zWko|LKvIhN+Lj5+D&XJZae`39>?g!bO1xWIw{5H-Q72QilGK5B5{b)l$|EV~k@D=> zlPblphs$W-5)rsY;uU;K5>P;b%B)dX7;RMLkoQs`oUtkb0zk<;f>Ez)JK!=B0S7Wf zTyALOk(({pM+InSoG?|$T>;ZbAtjoOf{zGNNO4aaNTEZ@S;r2Gx#N&75plvJIxo%= z5BJss=#s>w|4H61 zqi-jQB{~v<0$4Agz??k*%_Q4F;(%C%-UAUoftF1IN48Wi0|Mh2lhL8@ANmlaGD`Kf zpNd1nQuYk7bB*NFh5}MG=^9G2xup>d!vO%GJrGr{Hg+XotEnQ8Og?=@%WETD==y@t65PSo z0~-g66!8PiZnR<5~0(4Kq##U zJ(=9-oLpr}nH{|3*&kZ$VQ@!aghGChxSYKO9fS})mrj6T!^VnSh z?T7b4$^Ke{!Am8&BigD74M@aB?n+Uo>;z;49O0|U5D_bMR(i8y3}kOaQHj+NNj*gkas>d^iX9{lvqH5iO8`m+N0D@2A z8+?)~d|53`5h&V~2FY0D7=lKn3N%vmJmtbNCrKbU)u>-i1%_*qa&lAqCBx~6zv{4LWgdqy) zC6|7^|ZU!FN7BBt{rMUIqV&U-6ae1$j$=i#74VnF~=XrxpcY;HE& z0e(!;;+q_x`1v#q%8Xzr1+hb5OJO0 zyW8ib<8zKrK+Q6YPeu}Y7Njgdd1_w)ViKE=xgXI`&%DdJ4=iZIuJPOh2*4aB@O zWCBxNqIO)ioxa^qgnjrm(l0YlKhOZdVHgVlDvA`Zuq(h$);9tH~7nu_VI2C4| zW*BpwB3>X?rJ|sj>y5J%8wrbs2Cf&m2jRXs`eu@TrL-tECmODW28P97-xcF8nrMtfl}l>Y53tAkP?chM4K#UDHp^# z60efKUZ2Wh-Y=2auI~v@j15${PqXv|ij$h0I|gtJSQ^o{aQSyVPw3PXODOunZaR13 zDbOk`1;aDA*^#}4tR{#*{N~vTLXieng_92oB3+SUBY`Nv6)Bs)sw4=#YBw38p}}r* zVqJHflj>Wz9}cg8QXBE9VM$}Hsf4O2TXhi~PwhJ_G%y_$^xE2^t07a+^b~Gjj2&2l zoj}e4u-=@CbfiMZOB3G~SbzJePzVI@Mrr;9>OyXY50RjNsTe9F(pS6wPvlluwfk0Ln;_jpv42gFv(dcoC62wq5^@WCLylpx)aSdhf`u96^) zkV$LPd~2=?=i5?{RA5k%!-DY@@#DFj6tEEOgiXx@b&;U+L?A?;l$Au@lTR_ir-!n# zeosPHurW9x6!6frDRRqb2)*l^XdI~~0Wq1+Q+g#4b2}s9EZy-Ut7S`wI&e`pmDY3{ zq?DKHC{hWCW^5#E8oCqn<&-s=4@UvF(-AI_n2z-cE7_kN?+R%Ot^_UMuNp0LpLg9` zp!XejsGxL@iWjcN6?=B!s*z3v&Zd3i>{A1;Vmg5$z_^Wzco<0f&U5a3o><)-?+Pd( z)(e%jzALB|(+JW-e*_2t5r2q?2&tp{5%u-6z9lyZ&_pph%}mLGMdTJ_h!z5rqi;?H z9yPuL@FY=m7V8y3b=IzP((ZtMf7%K)g$qI_ajITtjGyvv=tc%!-Qt! zoIS}I!NI6TfP{uwp~Vm-agmWyC6ihR?`*C}JV^^U{^UPPayGFD9ft|;*-LZc*}tXj z3`{9JA*zIG;QGj%_~P^i!@syH@{4rOZKUqc@GYx@!jpjH#1<(~ERjA!V1QI$c@mVA zq()W?*@?ITU$0toa9f-c5g$4ep!s7mM2{s1IbgZvwGe6HaMAu?-D`;i5y?Kf13@IAxk5~v2m-#_Y9S=DJABt> z;~7gAW^^WmY{+ymB!b2~JH97el^s`0Bt(iqJ|Dq-bUcxje2tDyb$BQsKilQD2GOM375d<+j0!$%M7YR(6l*V4l|(6X{-1BR z7T0xb}+PQ<_iVz!P6%iw& z;LxHtDN3L1C$wxKVvy*WGt80ILUktuBm20yWsAEsQCUj}z?+^Uzl&KM@{t6nUv&Rl zd*gg)izGNOCrkjCERoor!Vg>oSf+GYovj0Q37B5M)|K<1jZ#4a z#z3n&2=9>{0_26GMV~{U4DpPSrj`r|Oi`SVSoc%f0#iFjD}U(~CK8VqSmJ5|f56a+ z#VgYC4axvs5OhiATUPFeLQX5jmd<`s;Js=eg5sfNA3PWanySPFF9s)EM`bv>Cn|DZ@a8dx& z3rPkycAmgd)Kn8@UlsXC53Eto(K3ZFRJ79+3NV4Z zKqTs*5G89%fwxNk=O(Bc`Z^J6y_z81?4>lJUg94}6YHfvQOU(;? zg6I3WxHCIkZ?Y=)eW`}kE@KCN%1Clo!q1UA3;!T;R~{Zo!~{Y_a4y}dQP+|4d}y`c zNm6_d6d~U!x$NVT=UVgOIVIAegOYH21e}aWJh|&#_ZAp}?>FILf<%a>rco5%ln^2s z4Oyaci`|s32L|%kv+i4L?WGU*1LrBZt3_W^d3fX%P6ggH2T#e}Iz~dZgJIDAhz@{| z$0K+Gao>ZhP303*u$~bmj7{uR9vXRt)sh%Pu_~H?uKimoEWka`?j+D?!4{Fe0(L3n znyY_r26EK{?|FsQ!qla|x)h4>1XLiv1PL%c`bS@O*d3A80(${@ks-Tk_XYGc=ousz zDJl`qc>dBB!YBj)`d3EgB)KPCdfHO2wWgpiE#_FdRGC;E6rUK{^;CrOyW6Qyp-p`Z z5D5+u?+MEU#DtbU(rG$ce;~C%JI)Cw1%3?ut!JhcIYQwkODM~?F+m<9d)r_ycl!DU zee)2PK<&X*C4mo2uiTjVL>l8K)5u4r`$<0G2APEH!#Giev3gM2f4O~h?^anDQu(HP$dlglCGRi=pV%?gJ^4(!%0;X&-Q;#I9f=cX)uMOlFJlGlc&3)r!Tpg6%?bq+U?#A&`M`uT;PaPc})JMZJcc*)2 z#l2xVJv%x%<*zX)w{9K0@lbyME`Bcq-!i>(^Q$|Dd#7j3vu6k0aCUff@85$KH)2|5kk}u%_r?XVDy(~2kN!A%Zvc*%LUyOh5sfmY5 z+uVe&w`bwW)E!uTV8Uxsb&#g#)0`fy&YtT|rs6iMzqwzGNBy+-`1yP7DRn*Fd(~GR z-W!jeJAL*3jjfA6y7%mKa^LcgyOZwjbT*xw-rQfE9NpbJyxZNLZXDmcy?1uB*Bu|< zIUG89@f*+H8?SdV?e&Z8+&<4~_iTKNur7m|3||Z+OPxSS(g_{u9fz9}f&hEEVK{&H z`?e_K`12<-bD;ABlf5R*cHW}R@eNOP_ij()&HWpHf|m&+SHY|%KGn`Kjsstm4_!Jz z;Ge8rO?^M~{!?B?1Ubo^oOhZZq*p#~ecyRs;bn$TD*>P8&_ymTgk<}sjnm2DeKK&r zoLwwoZ1Lu z{rh^oldas&)3Yb0)xl*tXQ>Rz_;I5JMQ6=dTK)vRb#bu|R5ndnHslHXO`n8;%?haZ zB<+nFvM>QBcCuOWw4;;5+lTkMJLkIfToaBkebbM==d=FRpMUPXU-AnddP`A%?|=T`P7u*I)ee;o67Z|Mow4Lo@#FJ74~WAAQw# zzv_Lz@XnWi;uC-PGw*ox?wgK2{BKYH=ePXS&%fjEe#?u0=~wT4;Pm;w{yRVZhtIzJ z3%~F?-l_ln+rRwBp7@=ozw-P4{!jk%U;Tz}I(+Fn{?f_c`|U4#-|35!k0#Il>>vHe z?eBQW=lz>keDE&Id+o1(^}U-vSAFd0n}7DBZ+rLNwe;&h^5OTJpZ~;v_}`EG_uu%b z{Xg}$e)?S(gYF-`{ym5NpZkh$_(u1?K0bZ>FaFcR@BRxfy<0q;yy?|% z|H&_X)2k1D=nH=T(H|N={@Y*r+aLI?S04Z3+un2hl5f596(9VYk9_YF<_B-R?7zJ9 z`~TaQee7FK|MWMdpZ9IQ_x<|c9rt&?^O0A5-!HxNdq430um1Xv+&+G9`^abh=1<>x z`G^1b@%NcqFM7?(e(yj1Nb)7$-n{a$FS_$v|M7GG?BOH7{DH@R;@4mGci!~2*M9PK n-}A#?_@4Lt*GE6{(a-