From 028d03b147c5a063c25cef12f608f4387585686f Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Thu, 4 Jan 2024 23:18:36 +0700 Subject: [PATCH 1/8] Fix registry dumb creating invalid csv file --- .../mc/otm/matter/MatterManager.kt | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterManager.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterManager.kt index 18f0572ff..125672996 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterManager.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterManager.kt @@ -1611,6 +1611,22 @@ object MatterManager { val stream2 = stream.map { it to get(it.value) } + fun writeValue(a: String, b: String, c: String, commentary: Collection) { + if (commentary.size < 2) { + writer.write(arrayOf(a, b, c, commentary.firstOrNull() ?: "").joinToString(";", transform = ::transformQuotes)) + writer.write("\n") + } else { + val iterator = commentary.iterator() + writer.write(arrayOf(a, b, c, iterator.next()).joinToString(";", transform = ::transformQuotes)) + writer.write("\n") + + for (v in iterator) { + writer.write(arrayOf("", "", "", v).joinToString(";", transform = ::transformQuotes)) + writer.write("\n") + } + } + } + for ((entry, value) in filter.filter(stream2)) { val (key, item) = entry val isBlacklisted: Boolean @@ -1624,16 +1640,14 @@ object MatterManager { } if (isBlacklisted) { - writer.write(arrayOf(key.location().toString(), "---", "---", "Item is blacklisted from having matter value").joinToString(";", transform = ::transformQuotes)) + writeValue(key.location().toString(), "---", "---", listOf("Item is blacklisted from having matter value")) } else { if (!value.hasMatterValue) { - writer.write(arrayOf(key.location().toString(), "", "", commentary[item]?.joinToString("\n", transform = { transformQuotes(it.string) }) ?: "").joinToString(";", transform = ::transformQuotes)) + writeValue(key.location().toString(), "", "", commentary[item]?.map { it.string } ?: listOf()) } else { - writer.write(arrayOf(key.location().toString(), value.matter.toString(), value.complexity.toString(), commentary[item]?.joinToString("\n", transform = { transformQuotes(it.string) }) ?: "").joinToString(";", transform = ::transformQuotes)) + writeValue(key.location().toString(), value.matter.toString(), value.complexity.toString(), commentary[item]?.map { it.string } ?: listOf()) } } - - writer.write("\n") } writer.close() From a95a5f27ff99bbb26c442b76a41b3340a45afcd0 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 5 Jan 2024 00:24:53 +0700 Subject: [PATCH 2/8] Wireless charger, pattern monitor, driver viewer and storage power supplier coloring --- .../advancements/MachineAdvancementsData.kt | 4 +- .../mc/otm/datagen/blocks/BlockModels.kt | 9 +++ .../mc/otm/datagen/blocks/BlockStates.kt | 23 +++--- .../otm/datagen/blocks/ComplexBlockStates.kt | 26 ++++--- .../mc/otm/datagen/items/ItemModels.kt | 9 ++- .../mc/otm/datagen/lang/English.kt | 10 +-- .../mc/otm/datagen/lang/Russian.kt | 10 +-- .../mc/otm/datagen/loot/LootTablesData.kt | 8 +- .../datagen/models/MatteryModelProvider.kt | 4 + .../datagen/recipes/CraftingTableRecipes.kt | 2 +- .../mc/otm/datagen/recipes/PainterRecipes.kt | 4 + .../dbotthepony/mc/otm/datagen/tags/Tags.kt | 8 +- .../mc/otm/block/matter/MatterPanelBlock.kt | 3 +- .../mc/otm/block/storage/DriveViewerBlock.kt | 3 +- .../storage/StoragePowerSupplierBlock.kt | 3 +- .../mc/otm/block/tech/AndroidChargerBlock.kt | 3 +- .../ru/dbotthepony/mc/otm/registry/Ext.kt | 10 +-- .../mc/otm/registry/MBlockEntities.kt | 58 +++++++------- .../ru/dbotthepony/mc/otm/registry/MBlocks.kt | 72 +++++++++--------- .../mc/otm/registry/MEntityTypes.kt | 4 +- .../ru/dbotthepony/mc/otm/registry/MItems.kt | 65 +++++++++------- .../blockstates/matter_panel.json | 27 ------- .../textures/block/android_charger/black.png | Bin 0 -> 836 bytes .../textures/block/android_charger/blue.png | Bin 0 -> 836 bytes .../textures/block/android_charger/brown.png | Bin 0 -> 836 bytes .../textures/block/android_charger/cyan.png | Bin 0 -> 836 bytes .../textures/block/android_charger/gray.png | Bin 0 -> 836 bytes .../textures/block/android_charger/green.png | Bin 0 -> 836 bytes .../block/android_charger/light_blue.png | Bin 0 -> 836 bytes .../block/android_charger/light_gray.png | Bin 0 -> 836 bytes .../textures/block/android_charger/lime.png | Bin 0 -> 836 bytes .../block/android_charger/magenta.png | Bin 0 -> 836 bytes .../textures/block/android_charger/orange.png | Bin 0 -> 836 bytes .../textures/block/android_charger/pink.png | Bin 0 -> 836 bytes .../textures/block/android_charger/purple.png | Bin 0 -> 836 bytes .../textures/block/android_charger/red.png | Bin 0 -> 836 bytes .../textures/block/android_charger/white.png | Bin 0 -> 836 bytes .../textures/block/android_charger/yellow.png | Bin 0 -> 836 bytes .../textures/block/android_charger_mask.png | Bin 0 -> 1717 bytes .../textures/block/drive_viewer/black.png | Bin 0 -> 702 bytes .../textures/block/drive_viewer/blue.png | Bin 0 -> 702 bytes .../textures/block/drive_viewer/brown.png | Bin 0 -> 702 bytes .../textures/block/drive_viewer/cyan.png | Bin 0 -> 702 bytes .../textures/block/drive_viewer/gray.png | Bin 0 -> 702 bytes .../textures/block/drive_viewer/green.png | Bin 0 -> 702 bytes .../block/drive_viewer/light_blue.png | Bin 0 -> 702 bytes .../block/drive_viewer/light_gray.png | Bin 0 -> 702 bytes .../textures/block/drive_viewer/lime.png | Bin 0 -> 702 bytes .../textures/block/drive_viewer/magenta.png | Bin 0 -> 702 bytes .../textures/block/drive_viewer/orange.png | Bin 0 -> 702 bytes .../textures/block/drive_viewer/pink.png | Bin 0 -> 702 bytes .../textures/block/drive_viewer/purple.png | Bin 0 -> 702 bytes .../textures/block/drive_viewer/red.png | Bin 0 -> 702 bytes .../textures/block/drive_viewer/white.png | Bin 0 -> 702 bytes .../textures/block/drive_viewer/yellow.png | Bin 0 -> 702 bytes .../textures/block/drive_viewer_mask.png | Bin 0 -> 1234 bytes .../textures/block/item_monitor/black.png | Bin 580 -> 580 bytes .../textures/block/item_monitor/blue.png | Bin 580 -> 580 bytes .../textures/block/item_monitor/brown.png | Bin 580 -> 580 bytes .../textures/block/item_monitor/cyan.png | Bin 580 -> 580 bytes .../textures/block/item_monitor/gray.png | Bin 580 -> 580 bytes .../textures/block/item_monitor/green.png | Bin 580 -> 580 bytes .../block/item_monitor/light_blue.png | Bin 580 -> 580 bytes .../block/item_monitor/light_gray.png | Bin 580 -> 580 bytes .../textures/block/item_monitor/lime.png | Bin 580 -> 580 bytes .../textures/block/item_monitor/magenta.png | Bin 580 -> 580 bytes .../textures/block/item_monitor/orange.png | Bin 580 -> 580 bytes .../textures/block/item_monitor/pink.png | Bin 580 -> 580 bytes .../textures/block/item_monitor/purple.png | Bin 580 -> 580 bytes .../textures/block/item_monitor/red.png | Bin 580 -> 580 bytes .../textures/block/item_monitor/white.png | Bin 607 -> 580 bytes .../textures/block/item_monitor/yellow.png | Bin 580 -> 580 bytes .../textures/block/item_monitor_mask.png | Bin 956 -> 954 bytes .../textures/block/matter_panel/black.png | Bin 0 -> 635 bytes .../textures/block/matter_panel/blue.png | Bin 0 -> 635 bytes .../textures/block/matter_panel/brown.png | Bin 0 -> 635 bytes .../textures/block/matter_panel/cyan.png | Bin 0 -> 635 bytes .../textures/block/matter_panel/gray.png | Bin 0 -> 635 bytes .../textures/block/matter_panel/green.png | Bin 0 -> 635 bytes .../block/matter_panel/light_blue.png | Bin 0 -> 635 bytes .../block/matter_panel/light_gray.png | Bin 0 -> 635 bytes .../textures/block/matter_panel/lime.png | Bin 0 -> 635 bytes .../textures/block/matter_panel/magenta.png | Bin 0 -> 635 bytes .../textures/block/matter_panel/orange.png | Bin 0 -> 635 bytes .../textures/block/matter_panel/pink.png | Bin 0 -> 635 bytes .../textures/block/matter_panel/purple.png | Bin 0 -> 635 bytes .../textures/block/matter_panel/red.png | Bin 0 -> 635 bytes .../textures/block/matter_panel/white.png | Bin 0 -> 635 bytes .../textures/block/matter_panel/yellow.png | Bin 0 -> 635 bytes .../textures/block/matter_panel_mask.png | Bin 0 -> 1053 bytes .../block/storage_power_supplier/black.png | Bin 0 -> 672 bytes .../block/storage_power_supplier/blue.png | Bin 0 -> 672 bytes .../block/storage_power_supplier/brown.png | Bin 0 -> 672 bytes .../block/storage_power_supplier/cyan.png | Bin 0 -> 672 bytes .../block/storage_power_supplier/gray.png | Bin 0 -> 672 bytes .../block/storage_power_supplier/green.png | Bin 0 -> 672 bytes .../storage_power_supplier/light_blue.png | Bin 0 -> 672 bytes .../storage_power_supplier/light_gray.png | Bin 0 -> 672 bytes .../block/storage_power_supplier/lime.png | Bin 0 -> 672 bytes .../block/storage_power_supplier/magenta.png | Bin 0 -> 672 bytes .../block/storage_power_supplier/orange.png | Bin 0 -> 672 bytes .../block/storage_power_supplier/pink.png | Bin 0 -> 672 bytes .../block/storage_power_supplier/purple.png | Bin 0 -> 672 bytes .../block/storage_power_supplier/red.png | Bin 0 -> 672 bytes .../block/storage_power_supplier/white.png | Bin 0 -> 669 bytes .../block/storage_power_supplier/yellow.png | Bin 0 -> 672 bytes .../block/storage_power_supplier_mask.png | Bin 0 -> 1221 bytes 107 files changed, 190 insertions(+), 175 deletions(-) delete mode 100644 src/main/resources/assets/overdrive_that_matters/blockstates/matter_panel.json create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/black.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/blue.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/brown.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/cyan.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/gray.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/green.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/light_blue.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/light_gray.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/lime.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/magenta.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/orange.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/pink.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/purple.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/red.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/white.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/yellow.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/android_charger_mask.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/black.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/blue.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/brown.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/cyan.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/gray.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/green.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/light_blue.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/light_gray.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/lime.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/magenta.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/orange.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/pink.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/purple.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/red.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/white.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/yellow.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer_mask.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/black.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/blue.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/brown.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/cyan.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/gray.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/green.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/light_blue.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/light_gray.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/lime.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/magenta.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/orange.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/pink.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/purple.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/red.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/white.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/yellow.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel_mask.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/black.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/blue.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/brown.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/cyan.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/gray.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/green.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/light_blue.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/light_gray.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/lime.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/magenta.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/orange.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/pink.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/purple.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/red.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/white.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/yellow.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier_mask.png diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/MachineAdvancementsData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/MachineAdvancementsData.kt index 7b2d4d3b7..942edb0de 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/MachineAdvancementsData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/MachineAdvancementsData.kt @@ -106,7 +106,7 @@ fun addMachineAdvancements(serializer: Consumer, lang: Matter russianName = "Сканируем вещи которые материальны") val decomposer = CraftEntry(MItems.MATTER_DECOMPOSER.values, "Decaying the Atoms", "Keep your limbs outside of the working chamber at all times", russianName = "Разлагаем атомы", russianSuffix = "Во всех ситуациях держите свои конечности вне рабочей камеры") - val panel = CraftEntry(MItems.MATTER_PANEL, "Indexing the Library", + val panel = CraftEntry(MItems.MATTER_PANEL.values, "Indexing the Library", russianName = "Индексируем библиотеку") val replicator = CraftEntry(MItems.MATTER_REPLICATOR.values, "Cook with (Im)Perfection", "Now let's bake some perfect bread", russianName = "Повар с (не) идеальностями", russianSuffix = "А теперь давайте выпечем немного идеального хлеба") @@ -182,7 +182,7 @@ fun addMachineAdvancements(serializer: Consumer, lang: Matter russianSuffix = "Только пользоваться этим устройством могут вёдра с болтами", englishSuffix = "Except only buckets of bolts can use this thing") - val charger = CraftEntry(MItems.ANDROID_CHARGER, "Android Home Router", + val charger = CraftEntry(MItems.ANDROID_CHARGER.values, "Android Home Router", russianName = "Домашняя страница андроидов") station.make(serializer, press, translation).also { diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockModels.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockModels.kt index 56051f317..70c9388cb 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockModels.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockModels.kt @@ -18,6 +18,15 @@ fun addBlockModels(provider: MatteryBlockModelProvider) { colored("matter_capacitor_bank", listOf("1", "particle"), "mattercapacitorbank_frame") colored("battery_bank", listOf("1", "particle"), "batterybank_frame") + colored("android_charger", "_base", listOf("0", "particle")) + colored("android_charger", "_middle", listOf("0", "particle")) + colored("android_charger", "_top", listOf("0", "particle")) + + colored("storage_power_supplier", listOf("0", "particle")) + colored("matter_panel", listOf("texture", "particle")) + colored("drive_viewer", "_idle", listOf("texture", "particle")) + colored("drive_viewer", "_working", listOf("texture", "particle")) + coloredMachineCombined("plate_press", "plate_press2", listOf("0", "particle")) coloredMachineCombined("twin_plate_press", "plate_press2", listOf("0", "particle")) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt index 5d1e53aca..70bacd72d 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt @@ -46,15 +46,17 @@ fun addBlockStates(provider: MatteryBlockStateProvider) { } } - with(provider.getMultipartBuilder(MBlocks.ANDROID_CHARGER)) { - for (dir in BlockRotationFreedom.HORIZONTAL.possibleValues) { - for (part in AndroidChargerBlock.PART.possibleValues) { - part().modelFile(provider.models().getExistingFile(modLocation("block/${MNames.ANDROID_CHARGER}_${part.serializedName}"))) - .rotationY(dir.front.yRotationBlockstateNorth()) - .addModel() - .condition(AndroidChargerBlock.PART, part) - .condition(BlockRotationFreedom.HORIZONTAL.property, dir) - .end() + for (block in MBlocks.ANDROID_CHARGER.values) { + with(provider.getMultipartBuilder(block)) { + for (dir in BlockRotationFreedom.HORIZONTAL.possibleValues) { + for (part in AndroidChargerBlock.PART.possibleValues) { + part().modelFile(provider.models().getExistingFile(modLocation("block/${block.registryName!!.path}_${part.serializedName}"))) + .rotationY(dir.front.yRotationBlockstateNorth()) + .addModel() + .condition(AndroidChargerBlock.PART, part) + .condition(BlockRotationFreedom.HORIZONTAL.property, dir) + .end() + } } } } @@ -104,7 +106,8 @@ fun addBlockStates(provider: MatteryBlockStateProvider) { provider.block(MBlocks.POWERED_FURNACE.values) provider.block(MBlocks.POWERED_SMOKER.values) - provider.block(MBlocks.STORAGE_POWER_SUPPLIER) + provider.block(MBlocks.STORAGE_POWER_SUPPLIER.values) + provider.block(MBlocks.MATTER_PANEL.values) provider.block(MBlocks.MATTER_RECYCLER.values) provider.block(MBlocks.MATTER_RECONSTRUCTOR.values) provider.block(MBlocks.ENERGY_SERVO) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/ComplexBlockStates.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/ComplexBlockStates.kt index dbadd096c..730923d29 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/ComplexBlockStates.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/ComplexBlockStates.kt @@ -11,22 +11,24 @@ import ru.dbotthepony.mc.otm.datagen.modLocation import ru.dbotthepony.mc.otm.registry.MBlocks fun addComplexBlockStates(provider: MatteryBlockStateProvider) { - with(provider.getMultipartBuilder(MBlocks.DRIVE_VIEWER)) { - for (facing in BlockRotationFreedom.HORIZONTAL.possibleValues) { - part() - .modelFile(provider.models().getExistingFile(modLocation("block/drive_viewer_drive_part"))) - .rotationY(facing.front.yRotationBlockstateNorth()) - .addModel() - .condition(BlockRotationFreedom.HORIZONTAL.property, facing) - .condition(DriveViewerBlock.DRIVE_PRESENT, true) - - for (workState in WorkerState.SEMI_WORKER_STATE.possibleValues) { + for (block in MBlocks.DRIVE_VIEWER.values) { + with(provider.getMultipartBuilder(block)) { + for (facing in BlockRotationFreedom.HORIZONTAL.possibleValues) { part() - .modelFile(provider.models().getExistingFile(modLocation("block/drive_viewer_${workState.name.lowercase()}"))) + .modelFile(provider.models().getExistingFile(modLocation("block/drive_viewer_drive_part"))) .rotationY(facing.front.yRotationBlockstateNorth()) .addModel() - .condition(WorkerState.SEMI_WORKER_STATE, workState) .condition(BlockRotationFreedom.HORIZONTAL.property, facing) + .condition(DriveViewerBlock.DRIVE_PRESENT, true) + + for (workState in WorkerState.SEMI_WORKER_STATE.possibleValues) { + part() + .modelFile(provider.models().getExistingFile(modLocation("block/drive_viewer_${workState.name.lowercase()}"))) + .rotationY(facing.front.yRotationBlockstateNorth()) + .addModel() + .condition(WorkerState.SEMI_WORKER_STATE, workState) + .condition(BlockRotationFreedom.HORIZONTAL.property, facing) + } } } } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt index 24c4e1784..cd6b384e7 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt @@ -183,10 +183,17 @@ fun addItemModels(provider: MatteryItemModelProvider) { provider.coloredWithBaseBlock(MItems.PLATE_PRESS, "plate_press", "_idle") provider.coloredWithBaseBlock(MItems.TWIN_PLATE_PRESS, "twin_plate_press", "_idle") - provider.block(MItems.STORAGE_POWER_SUPPLIER, "storage_power_supplier") + provider.coloredWithBaseBlock(MItems.STORAGE_POWER_SUPPLIER, "storage_power_supplier") provider.coloredWithBaseBlock(MItems.MATTER_RECYCLER, "matter_recycler", "_idle") provider.coloredWithBaseBlock(MItems.COBBLESTONE_GENERATOR, "cobblestone_generator") + for (dye in DyeColor.entries) { + provider.exec { + provider.withExistingParent("android_charger_${dye.name.lowercase()}", modLocation("item/android_charger")).texture("0", modLocation("block/android_charger/${dye.name.lowercase()}")) + provider.withExistingParent("matter_panel_${dye.name.lowercase()}", modLocation("item/matter_panel")).texture("texture", modLocation("block/matter_panel/${dye.name.lowercase()}")) + } + } + provider.block(MItems.STORAGE_BUS) provider.block(MItems.STORAGE_IMPORTER) provider.block(MItems.STORAGE_EXPORTER) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt index 912698d02..927636f6f 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt @@ -417,18 +417,18 @@ private fun death(provider: MatteryLanguageProvider) { private fun blocks(provider: MatteryLanguageProvider) { with(provider.english) { addBlock(MBlocks.ANDROID_STATION.values, "Android Station") - add(MBlocks.ANDROID_CHARGER, "Wireless Charger") - add(MBlocks.ANDROID_CHARGER, "desc", "Charges nearby androids and exopacks") + addBlock(MBlocks.ANDROID_CHARGER.values, "Wireless Charger") + addBlock(MBlocks.ANDROID_CHARGER.values, "desc", "Charges nearby androids and exopacks") addBlock(MBlocks.BATTERY_BANK.values, "Battery Bank") addBlock(MBlocks.MATTER_DECOMPOSER.values, "Matter Decomposer") addBlock(MBlocks.MATTER_CAPACITOR_BANK.values, "Matter Capacitor Bank") add(MBlocks.MATTER_CABLE, "Matter Network Cable") add(MBlocks.PATTERN_STORAGE, "Pattern Storage") addBlock(MBlocks.MATTER_SCANNER.values, "Matter Scanner") - add(MBlocks.MATTER_PANEL, "Pattern Monitor") + addBlock(MBlocks.MATTER_PANEL.values, "Pattern Monitor") addBlock(MBlocks.MATTER_REPLICATOR.values, "Matter Replicator") addBlock(MBlocks.MATTER_BOTTLER.values, "Matter Bottler") - add(MBlocks.DRIVE_VIEWER, "Drive Viewer") + addBlock(MBlocks.DRIVE_VIEWER.values, "Drive Viewer") add(MBlocks.BLACK_HOLE, "Local Anomalous Spacetime Dilation Singular Point") addBlock(MBlocks.COBBLESTONE_GENERATOR.values, "Cobblestone Generator") add(MBlocks.INFINITE_WATER_SOURCE, "Infinite Water Source") @@ -486,7 +486,7 @@ private fun blocks(provider: MatteryLanguageProvider) { add(MBlocks.TRITANIUM_RAW_BLOCK, "Raw Tritanium Block") add(MBlocks.STORAGE_CABLE, "Storage Cable") - add(MBlocks.STORAGE_POWER_SUPPLIER, "Storage Power Supplier") + addBlock(MBlocks.STORAGE_POWER_SUPPLIER.values, "Storage Power Supplier") add(MBlocks.STORAGE_BUS, "Storage Bus") add(MBlocks.STORAGE_IMPORTER, "Storage Importer") add(MBlocks.STORAGE_EXPORTER, "Storage Exporter") diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt index 33373595b..3dc3f7820 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt @@ -419,18 +419,18 @@ private fun death(provider: MatteryLanguageProvider) { private fun blocks(provider: MatteryLanguageProvider) { with(provider.russian) { addBlock(MBlocks.ANDROID_STATION.values, "Станция андроидов") - add(MBlocks.ANDROID_CHARGER, "Беспроводной зарядник") - add(MBlocks.ANDROID_CHARGER, "desc", "Заряжает ближайших андроидов и экзопаки") + addBlock(MBlocks.ANDROID_CHARGER.values, "Беспроводной зарядник") + addBlock(MBlocks.ANDROID_CHARGER.values, "desc", "Заряжает ближайших андроидов и экзопаки") addBlock(MBlocks.BATTERY_BANK.values, "Банк аккумуляторов") addBlock(MBlocks.MATTER_DECOMPOSER.values, "Декомпозитор материи") addBlock(MBlocks.MATTER_CAPACITOR_BANK.values, "Банк накопителей материи") add(MBlocks.MATTER_CABLE, "Кабель сети материи") add(MBlocks.PATTERN_STORAGE, "Хранилище шаблонов") addBlock(MBlocks.MATTER_SCANNER.values, "Сканер материи") - add(MBlocks.MATTER_PANEL, "Монитор шаблонов") + addBlock(MBlocks.MATTER_PANEL.values, "Монитор шаблонов") addBlock(MBlocks.MATTER_REPLICATOR.values, "Репликатор материи") addBlock(MBlocks.MATTER_BOTTLER.values, "Бутилировщик материи") - add(MBlocks.DRIVE_VIEWER, "Просмотрщик дисков конденсации") + addBlock(MBlocks.DRIVE_VIEWER.values, "Просмотрщик дисков конденсации") add(MBlocks.BLACK_HOLE, "Локализированная сингулярная точка аномального искажения пространства-времени") addBlock(MBlocks.COBBLESTONE_GENERATOR.values, "Генератор булыжника") add(MBlocks.INFINITE_WATER_SOURCE, "Неиссякаемый источник воды") @@ -488,7 +488,7 @@ private fun blocks(provider: MatteryLanguageProvider) { add(MBlocks.TRITANIUM_RAW_BLOCK, "Блок рудного тритана") add(MBlocks.STORAGE_CABLE, "Кабель хранилища") - add(MBlocks.STORAGE_POWER_SUPPLIER, "Подстанция сети хранилища") + addBlock(MBlocks.STORAGE_POWER_SUPPLIER.values, "Подстанция сети хранилища") add(MBlocks.STORAGE_BUS, "Шина хранилища") add(MBlocks.STORAGE_IMPORTER, "Импортер хранилища") add(MBlocks.STORAGE_EXPORTER, "Экспортер хранилища") diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTablesData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTablesData.kt index ae5ead785..c6d6db337 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTablesData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTablesData.kt @@ -144,14 +144,14 @@ fun addLootTables(lootTables: LootTables) { lootTables.tile(MBlocks.HOLO_SIGN, "isLocked") lootTables.tile(MBlocks.STORAGE_CABLE) lootTables.tile(MBlocks.ANDROID_STATION.values) - lootTables.tile(MBlocks.ANDROID_CHARGER) + lootTables.tile(MBlocks.ANDROID_CHARGER.values) lootTables.tile(MBlocks.BATTERY_BANK.values) - lootTables.tile(MBlocks.DRIVE_VIEWER) + lootTables.tile(MBlocks.DRIVE_VIEWER.values) lootTables.tile(MBlocks.STORAGE_BUS) lootTables.tile(MBlocks.STORAGE_IMPORTER) lootTables.tile(MBlocks.STORAGE_EXPORTER) - lootTables.tile(MBlocks.STORAGE_POWER_SUPPLIER) + lootTables.tile(MBlocks.STORAGE_POWER_SUPPLIER.values) lootTables.tile(MBlocks.DRIVE_RACK) lootTables.tile(MBlocks.MATTER_DECOMPOSER.values) @@ -165,7 +165,7 @@ fun addLootTables(lootTables: LootTables) { lootTables.tile(MBlocks.POWERED_SMOKER.values) lootTables.tile(MBlocks.POWERED_BLAST_FURNACE.values) - lootTables.tile(MBlocks.MATTER_PANEL) + lootTables.tile(MBlocks.MATTER_PANEL.values) lootTables.tile(MBlocks.PATTERN_STORAGE) lootTables.tile(MBlocks.MATTER_CAPACITOR_BANK.values) lootTables.tile(MBlocks.MATTER_BOTTLER.values) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelProvider.kt index 0075aa79c..6384439fb 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelProvider.kt @@ -127,6 +127,10 @@ class MatteryBlockModelProvider(event: GatherDataEvent) : BlockModelProvider(eve return colored(modelName, "", textureKeys.associateWith { modelName }) } + fun colored(modelName: String, suffix: String, textureKeys: Collection) { + return colored(modelName, suffix, textureKeys.associateWith { modelName }) + } + fun coloredMachineCombined(modelName: String, textureName: String, textureKeys: Collection) { for (state in listOf("_idle", "_error", "_working")) { colored(modelName, state, textureKeys.associateWith { textureName }) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt index 179217e2f..1b13af09d 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt @@ -328,7 +328,7 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) { .build(consumer) // беспроводной зарядник андроидов - MatteryRecipe(MItems.ANDROID_CHARGER, category = machinesCategory) + MatteryRecipe(MItems.ANDROID_CHARGER[null]!!, category = machinesCategory) .row(MItems.ELECTRIC_PARTS, MItems.QUANTUM_TRANSCEIVER, MItems.ELECTRIC_PARTS) .row(MItemTags.TRITANIUM_PLATES, MItems.MACHINE_FRAME, MItemTags.TRITANIUM_PLATES) .row(MItemTags.TRITANIUM_PLATES, MItems.MACHINE_FRAME, MItemTags.TRITANIUM_PLATES) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PainterRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PainterRecipes.kt index 88e9b0fd9..268946d80 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PainterRecipes.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PainterRecipes.kt @@ -289,6 +289,10 @@ fun addPainterRecipes(consumer: RecipeOutput) { MItems.POWERED_BLAST_FURNACE, MItems.MATTER_RECYCLER, MItems.ANDROID_STATION, + MItems.STORAGE_POWER_SUPPLIER, + MItems.DRIVE_VIEWER, + MItems.ANDROID_CHARGER, + MItems.MATTER_PANEL, ) for (list in blocks) { diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt index 5042d8d1c..6a05f734b 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt @@ -186,7 +186,7 @@ fun addTags(tagsProvider: TagsProvider) { *MBlocks.MATTER_CAPACITOR_BANK.values.toTypedArray(), MBlocks.PATTERN_STORAGE, *MBlocks.MATTER_SCANNER.values.toTypedArray(), - MBlocks.MATTER_PANEL, + *MBlocks.MATTER_PANEL.values.toTypedArray(), *MBlocks.MATTER_REPLICATOR.values.toTypedArray(), *MBlocks.MATTER_BOTTLER.values.toTypedArray(), MBlocks.ENERGY_COUNTER, @@ -204,10 +204,10 @@ fun addTags(tagsProvider: TagsProvider) { MBlocks.STORAGE_IMPORTER, MBlocks.STORAGE_EXPORTER, - MBlocks.DRIVE_VIEWER, + *MBlocks.DRIVE_VIEWER.values.toTypedArray(), MBlocks.DRIVE_RACK, *MBlocks.ITEM_MONITOR.values.toTypedArray(), - MBlocks.STORAGE_POWER_SUPPLIER, + *MBlocks.STORAGE_POWER_SUPPLIER.values.toTypedArray(), MBlocks.PHANTOM_ATTRACTOR, MBlocks.ENERGY_SERVO, @@ -223,7 +223,7 @@ fun addTags(tagsProvider: TagsProvider) { *MBlocks.ESSENCE_STORAGE.values.toTypedArray(), *MBlocks.MATTER_RECONSTRUCTOR.values.toTypedArray(), MBlocks.FLUID_TANK, - MBlocks.ANDROID_CHARGER, + *MBlocks.ANDROID_CHARGER.values.toTypedArray(), ), Tiers.IRON) tagsProvider.requiresPickaxe(MBlocks.TRITANIUM_ANVIL, Tiers.IRON) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterPanelBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterPanelBlock.kt index fbabb31e2..f8534819a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterPanelBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterPanelBlock.kt @@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableMap import net.minecraft.world.level.block.EntityBlock import net.minecraft.core.BlockPos import net.minecraft.core.Direction +import net.minecraft.world.item.DyeColor import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.level.block.entity.BlockEntity import ru.dbotthepony.mc.otm.block.entity.matter.MatterPanelBlockEntity @@ -17,7 +18,7 @@ import ru.dbotthepony.mc.otm.core.get import ru.dbotthepony.mc.otm.core.math.BlockRotation import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom -class MatterPanelBlock : RotatableMatteryBlock(DEFAULT_MACHINE_PROPERTIES), EntityBlock { +class MatterPanelBlock(val color: DyeColor?) : RotatableMatteryBlock(DEFAULT_MACHINE_PROPERTIES), EntityBlock { override fun newBlockEntity(blockPos: BlockPos, blockState: BlockState): BlockEntity { return MatterPanelBlockEntity(blockPos, blockState) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/storage/DriveViewerBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/storage/DriveViewerBlock.kt index f0c35ec79..7dd657190 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/storage/DriveViewerBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/storage/DriveViewerBlock.kt @@ -2,6 +2,7 @@ package ru.dbotthepony.mc.otm.block.storage import net.minecraft.core.BlockPos import net.minecraft.network.chat.Component +import net.minecraft.world.item.DyeColor import net.minecraft.world.item.ItemStack import net.minecraft.world.item.TooltipFlag import net.minecraft.world.item.context.BlockPlaceContext @@ -27,7 +28,7 @@ import ru.dbotthepony.mc.otm.core.get import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.shapes.BlockShapes -class DriveViewerBlock : RotatableMatteryBlock(DEFAULT_MACHINE_PROPERTIES), EntityBlock { +class DriveViewerBlock(val color: DyeColor?) : RotatableMatteryBlock(DEFAULT_MACHINE_PROPERTIES), EntityBlock { override fun newBlockEntity(blockPos: BlockPos, blockState: BlockState): BlockEntity { return DriveViewerBlockEntity(blockPos, blockState) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/storage/StoragePowerSupplierBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/storage/StoragePowerSupplierBlock.kt index 18562a541..90ab90cdb 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/storage/StoragePowerSupplierBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/storage/StoragePowerSupplierBlock.kt @@ -2,6 +2,7 @@ package ru.dbotthepony.mc.otm.block.storage import net.minecraft.core.BlockPos import net.minecraft.network.chat.Component +import net.minecraft.world.item.DyeColor import net.minecraft.world.item.ItemStack import net.minecraft.world.item.TooltipFlag import net.minecraft.world.level.BlockGetter @@ -22,7 +23,7 @@ import ru.dbotthepony.mc.otm.core.get import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.shapes.BlockShapes -class StoragePowerSupplierBlock : RotatableMatteryBlock(DEFAULT_MACHINE_PROPERTIES), EntityBlock { +class StoragePowerSupplierBlock(val color: DyeColor?) : RotatableMatteryBlock(DEFAULT_MACHINE_PROPERTIES), EntityBlock { override fun newBlockEntity(p_153215_: BlockPos, p_153216_: BlockState): BlockEntity { return StoragePowerSupplierBlockEntity(p_153215_, p_153216_) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/tech/AndroidChargerBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/tech/AndroidChargerBlock.kt index 432923221..d26a2b541 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/tech/AndroidChargerBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/tech/AndroidChargerBlock.kt @@ -6,6 +6,7 @@ import net.minecraft.network.chat.Component import net.minecraft.util.StringRepresentable import net.minecraft.world.entity.LivingEntity import net.minecraft.world.entity.player.Player +import net.minecraft.world.item.DyeColor import net.minecraft.world.item.ItemStack import net.minecraft.world.item.TooltipFlag import net.minecraft.world.item.context.BlockPlaceContext @@ -37,7 +38,7 @@ import ru.dbotthepony.mc.otm.core.math.plus import ru.dbotthepony.mc.otm.oncePre import ru.dbotthepony.mc.otm.shapes.BlockShapes -class AndroidChargerBlock : RotatableMatteryBlock(Properties.of().destroyTime(2.5f).explosionResistance(40f).pushReaction(PushReaction.BLOCK).requiresCorrectToolForDrops()), EntityBlock { +class AndroidChargerBlock(val color: DyeColor?) : RotatableMatteryBlock(Properties.of().destroyTime(2.5f).explosionResistance(40f).pushReaction(PushReaction.BLOCK).requiresCorrectToolForDrops()), EntityBlock { enum class Type : StringRepresentable { BASE, MIDDLE, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/Ext.kt index 9b3ff14b8..c6bddbba5 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/Ext.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/Ext.kt @@ -11,15 +11,15 @@ operator fun RegistryObject.getValue(thisRef: Any, property: KPrope return get() } -internal fun DeferredRegister.colored(prefix: String, factory: (color: DyeColor, name: String) -> R): Map { - return SupplierMap(MRegistry.DYE_ORDER.map { it to register(prefix + "_" + it.name.lowercase()) { factory.invoke(it, prefix + "_" + it.name.lowercase()) } }) +internal fun DeferredRegister.colored(prefix: String, factory: (color: DyeColor) -> R): Map { + return SupplierMap(MRegistry.DYE_ORDER.map { it to register(prefix + "_" + it.name.lowercase()) { factory.invoke(it) } }) } -internal fun DeferredRegister.coloredWithBase(prefix: String, factory: (color: DyeColor?, name: String) -> R): Map { +internal fun DeferredRegister.coloredWithBase(prefix: String, factory: (color: DyeColor?) -> R): Map { val values = ArrayList>>() - values.add(null to register(prefix) { factory.invoke(null, prefix) }) - MRegistry.DYE_ORDER.forEach { values.add(it to register(prefix + "_" + it.name.lowercase()) { factory.invoke(it, prefix + "_" + it.name.lowercase()) }) } + values.add(null to register(prefix) { factory.invoke(null) }) + MRegistry.DYE_ORDER.forEach { values.add(it to register(prefix + "_" + it.name.lowercase()) { factory.invoke(it) }) } return SupplierMap(values) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlockEntities.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlockEntities.kt index d79c1d9a9..4795cabdc 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlockEntities.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlockEntities.kt @@ -44,44 +44,48 @@ object MBlockEntities { return registry.register(name) { BlockEntityType.Builder.of(factory, *blocks.map { it.get() }.toTypedArray()).build(null) } } - val ANDROID_STATION by register(MNames.ANDROID_STATION, ::AndroidStationBlockEntity, *MBlocks.ANDROID_STATION.asSupplierArray()) - val BATTERY_BANK by register(MNames.BATTERY_BANK, ::BatteryBankBlockEntity, *MBlocks.BATTERY_BANK.asSupplierArray()) - val MATTER_DECOMPOSER by register(MNames.MATTER_DECOMPOSER, ::MatterDecomposerBlockEntity, *MBlocks.MATTER_DECOMPOSER.asSupplierArray()) - val MATTER_CAPACITOR_BANK by register(MNames.MATTER_CAPACITOR_BANK, ::MatterCapacitorBankBlockEntity, *MBlocks.MATTER_CAPACITOR_BANK.asSupplierArray()) + private fun register(name: String, factory: BlockEntityType.BlockEntitySupplier, blocks: Map<*, Block>): RegistryObject> { + return registry.register(name) { BlockEntityType.Builder.of(factory, *blocks.values.toTypedArray()).build(null) } + } + + val ANDROID_STATION by register(MNames.ANDROID_STATION, ::AndroidStationBlockEntity, MBlocks.ANDROID_STATION) + val BATTERY_BANK by register(MNames.BATTERY_BANK, ::BatteryBankBlockEntity, MBlocks.BATTERY_BANK) + val MATTER_DECOMPOSER by register(MNames.MATTER_DECOMPOSER, ::MatterDecomposerBlockEntity, MBlocks.MATTER_DECOMPOSER) + val MATTER_CAPACITOR_BANK by register(MNames.MATTER_CAPACITOR_BANK, ::MatterCapacitorBankBlockEntity, MBlocks.MATTER_CAPACITOR_BANK) val MATTER_CABLE by register(MNames.MATTER_CABLE, ::MatterCableBlockEntity, MBlocks::MATTER_CABLE) val STORAGE_CABLE by register(MNames.STORAGE_CABLE, ::StorageCableBlockEntity, MBlocks::STORAGE_CABLE) val PATTERN_STORAGE by register(MNames.PATTERN_STORAGE, ::PatternStorageBlockEntity, MBlocks::PATTERN_STORAGE) - val MATTER_SCANNER by register(MNames.MATTER_SCANNER, ::MatterScannerBlockEntity, *MBlocks.MATTER_SCANNER.asSupplierArray()) - val MATTER_PANEL by register(MNames.MATTER_PANEL, ::MatterPanelBlockEntity, MBlocks::MATTER_PANEL) - val MATTER_REPLICATOR by register(MNames.MATTER_REPLICATOR, ::MatterReplicatorBlockEntity, *MBlocks.MATTER_REPLICATOR.asSupplierArray()) - val MATTER_BOTTLER by register(MNames.MATTER_BOTTLER, ::MatterBottlerBlockEntity, *MBlocks.MATTER_BOTTLER.asSupplierArray()) - val DRIVE_VIEWER by register(MNames.DRIVE_VIEWER, ::DriveViewerBlockEntity, MBlocks::DRIVE_VIEWER) + val MATTER_SCANNER by register(MNames.MATTER_SCANNER, ::MatterScannerBlockEntity, MBlocks.MATTER_SCANNER) + val MATTER_PANEL by register(MNames.MATTER_PANEL, ::MatterPanelBlockEntity, MBlocks.MATTER_PANEL) + val MATTER_REPLICATOR by register(MNames.MATTER_REPLICATOR, ::MatterReplicatorBlockEntity, MBlocks.MATTER_REPLICATOR) + val MATTER_BOTTLER by register(MNames.MATTER_BOTTLER, ::MatterBottlerBlockEntity, MBlocks.MATTER_BOTTLER) + val DRIVE_VIEWER by register(MNames.DRIVE_VIEWER, ::DriveViewerBlockEntity, MBlocks.DRIVE_VIEWER) val BLACK_HOLE by register(MNames.BLACK_HOLE, ::BlackHoleBlockEntity, MBlocks::BLACK_HOLE) - val CARGO_CRATE by register(MNames.CARGO_CRATE, ::CargoCrateBlockEntity, *MRegistry.CARGO_CRATES.blocks.asSupplierArray()) + val CARGO_CRATE by register(MNames.CARGO_CRATE, ::CargoCrateBlockEntity, MRegistry.CARGO_CRATES.blocks) val DRIVE_RACK by register(MNames.DRIVE_RACK, ::DriveRackBlockEntity, MBlocks::DRIVE_RACK) - val ITEM_MONITOR by register(MNames.ITEM_MONITOR, ::ItemMonitorBlockEntity, *MBlocks.ITEM_MONITOR.asSupplierArray()) + val ITEM_MONITOR by register(MNames.ITEM_MONITOR, ::ItemMonitorBlockEntity, MBlocks.ITEM_MONITOR) val ENERGY_COUNTER by register(MNames.ENERGY_COUNTER, ::EnergyCounterBlockEntity, MBlocks::ENERGY_COUNTER) val CHEMICAL_GENERATOR by register(MNames.CHEMICAL_GENERATOR, ::ChemicalGeneratorBlockEntity, MBlocks::CHEMICAL_GENERATOR) - val PLATE_PRESS by register(MNames.PLATE_PRESS, ::PlatePressBlockEntity, *MBlocks.PLATE_PRESS.asSupplierArray()) - val TWIN_PLATE_PRESS by register(MNames.TWIN_PLATE_PRESS, { a, b -> PlatePressBlockEntity(a, b, true) }, *MBlocks.TWIN_PLATE_PRESS.asSupplierArray()) + val PLATE_PRESS by register(MNames.PLATE_PRESS, ::PlatePressBlockEntity, MBlocks.PLATE_PRESS) + val TWIN_PLATE_PRESS by register(MNames.TWIN_PLATE_PRESS, { a, b -> PlatePressBlockEntity(a, b, true) }, MBlocks.TWIN_PLATE_PRESS) val GRAVITATION_STABILIZER by register(MNames.GRAVITATION_STABILIZER, ::GravitationStabilizerBlockEntity, MBlocks::GRAVITATION_STABILIZER) - val MATTER_RECYCLER by register(MNames.MATTER_RECYCLER, ::MatterRecyclerBlockEntity, *MBlocks.MATTER_RECYCLER.asSupplierArray()) + val MATTER_RECYCLER by register(MNames.MATTER_RECYCLER, ::MatterRecyclerBlockEntity, MBlocks.MATTER_RECYCLER) val ENERGY_SERVO by register(MNames.ENERGY_SERVO, ::EnergyServoBlockEntity, MBlocks::ENERGY_SERVO) - val COBBLESTONE_GENERATOR by register(MNames.COBBLESTONE_GENERATOR, ::CobblerBlockEntity, *MBlocks.COBBLESTONE_GENERATOR.asSupplierArray()) - val ESSENCE_STORAGE by register(MNames.ESSENCE_STORAGE, ::EssenceStorageBlockEntity, *MBlocks.ESSENCE_STORAGE.asSupplierArray()) - val MATTER_RECONSTRUCTOR by register(MNames.MATTER_RECONSTRUCTOR, ::MatterReconstructorBlockEntity, *MBlocks.MATTER_RECONSTRUCTOR.asSupplierArray()) + val COBBLESTONE_GENERATOR by register(MNames.COBBLESTONE_GENERATOR, ::CobblerBlockEntity, MBlocks.COBBLESTONE_GENERATOR) + val ESSENCE_STORAGE by register(MNames.ESSENCE_STORAGE, ::EssenceStorageBlockEntity, MBlocks.ESSENCE_STORAGE) + val MATTER_RECONSTRUCTOR by register(MNames.MATTER_RECONSTRUCTOR, ::MatterReconstructorBlockEntity, MBlocks.MATTER_RECONSTRUCTOR) val FLUID_TANK by register(MNames.FLUID_TANK, ::FluidTankBlockEntity, MBlocks::FLUID_TANK) - val ANDROID_CHARGER by register(MNames.ANDROID_CHARGER, ::AndroidChargerBlockEntity, MBlocks::ANDROID_CHARGER) - val ANDROID_CHARGER_MIDDLE by register(MNames.ANDROID_CHARGER + "_middle", ::AndroidChargerMiddleBlockEntity, MBlocks::ANDROID_CHARGER) - val ANDROID_CHARGER_TOP by register(MNames.ANDROID_CHARGER + "_top", ::AndroidChargerTopBlockEntity, MBlocks::ANDROID_CHARGER) + val ANDROID_CHARGER by register(MNames.ANDROID_CHARGER, ::AndroidChargerBlockEntity, MBlocks.ANDROID_CHARGER) + val ANDROID_CHARGER_MIDDLE by register(MNames.ANDROID_CHARGER + "_middle", ::AndroidChargerMiddleBlockEntity, MBlocks.ANDROID_CHARGER) + val ANDROID_CHARGER_TOP by register(MNames.ANDROID_CHARGER + "_top", ::AndroidChargerTopBlockEntity, MBlocks.ANDROID_CHARGER) val INFINITE_WATER_SOURCE by register(MNames.INFINITE_WATER_SOURCE, ::InfiniteWaterSourceBlockEntity, MBlocks::INFINITE_WATER_SOURCE) val DEV_CHEST by register(MNames.DEV_CHEST, ::DevChestBlockEntity, MBlocks::DEV_CHEST) val PAINTER by register(MNames.PAINTER, ::PainterBlockEntity, MBlocks::PAINTER) val MATTER_ENTANGLER by register(MNames.MATTER_ENTANGLER, ::MatterEntanglerBlockEntity, MBlocks::MATTER_ENTANGLER) - val POWERED_FURNACE by register(MNames.POWERED_FURNACE, ::PoweredFurnaceBlockEntity, *MBlocks.POWERED_FURNACE.asSupplierArray()) - val POWERED_BLAST_FURNACE by register(MNames.POWERED_BLAST_FURNACE, ::PoweredBlastFurnaceBlockEntity, *MBlocks.POWERED_BLAST_FURNACE.asSupplierArray()) - val POWERED_SMOKER by register(MNames.POWERED_SMOKER, ::PoweredSmokerBlockEntity, *MBlocks.POWERED_SMOKER.asSupplierArray()) + val POWERED_FURNACE by register(MNames.POWERED_FURNACE, ::PoweredFurnaceBlockEntity, MBlocks.POWERED_FURNACE) + val POWERED_BLAST_FURNACE by register(MNames.POWERED_BLAST_FURNACE, ::PoweredBlastFurnaceBlockEntity, MBlocks.POWERED_BLAST_FURNACE) + val POWERED_SMOKER by register(MNames.POWERED_SMOKER, ::PoweredSmokerBlockEntity, MBlocks.POWERED_SMOKER) val ENERGY_CABLES: Map> = SupplierMap(CablesConfig.E.entries.map { conf -> var selfFeed: Supplier> = Supplier { TODO() } @@ -89,10 +93,10 @@ object MBlockEntities { conf to selfFeed }) - val STORAGE_BUS: BlockEntityType by registry.register(MNames.STORAGE_BUS) { BlockEntityType.Builder.of(::StorageBusBlockEntity, MBlocks.STORAGE_BUS).build(null) } - val STORAGE_IMPORTER: BlockEntityType by registry.register(MNames.STORAGE_IMPORTER) { BlockEntityType.Builder.of(::StorageImporterBlockEntity, MBlocks.STORAGE_IMPORTER).build(null) } - val STORAGE_EXPORTER: BlockEntityType by registry.register(MNames.STORAGE_EXPORTER) { BlockEntityType.Builder.of(::StorageExporterBlockEntity, MBlocks.STORAGE_EXPORTER).build(null) } - val STORAGE_POWER_SUPPLIER: BlockEntityType by registry.register(MNames.STORAGE_POWER_SUPPLIER) { BlockEntityType.Builder.of(::StoragePowerSupplierBlockEntity, MBlocks.STORAGE_POWER_SUPPLIER).build(null) } + val STORAGE_BUS by register(MNames.STORAGE_BUS, ::StorageBusBlockEntity, MBlocks::STORAGE_BUS) + val STORAGE_IMPORTER by register(MNames.STORAGE_IMPORTER, ::StorageImporterBlockEntity, MBlocks::STORAGE_IMPORTER) + val STORAGE_EXPORTER by register(MNames.STORAGE_EXPORTER, ::StorageExporterBlockEntity, MBlocks::STORAGE_EXPORTER) + val STORAGE_POWER_SUPPLIER by register(MNames.STORAGE_POWER_SUPPLIER, ::StoragePowerSupplierBlockEntity, MBlocks.STORAGE_POWER_SUPPLIER) val HOLO_SIGN: BlockEntityType by registry.register(MNames.HOLO_SIGN) { BlockEntityType.Builder.of(::HoloSignBlockEntity, MBlocks.HOLO_SIGN).build(null) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlocks.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlocks.kt index 828c32f80..47b5931b3 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlocks.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlocks.kt @@ -86,46 +86,46 @@ object MBlocks { registry.register(bus) } - val ANDROID_STATION = registry.coloredWithBase(MNames.ANDROID_STATION) { color, _ -> AndroidStationBlock(color) } - val ANDROID_CHARGER: Block by registry.register(MNames.ANDROID_CHARGER) { AndroidChargerBlock() } - val BATTERY_BANK = registry.coloredWithBase(MNames.BATTERY_BANK) { color, _ -> BatteryBankBlock(color) } - val MATTER_DECOMPOSER = registry.coloredWithBase(MNames.MATTER_DECOMPOSER) { color, _ -> MatterDecomposerBlock(color) } - val MATTER_CAPACITOR_BANK = registry.coloredWithBase(MNames.MATTER_CAPACITOR_BANK) { color, _ -> MatterCapacitorBankBlock(color) } - val MATTER_CABLE: Block by registry.register(MNames.MATTER_CABLE) { MatterCableBlock() } - val PATTERN_STORAGE: Block by registry.register(MNames.PATTERN_STORAGE) { PatternStorageBlock() } - val MATTER_SCANNER = registry.coloredWithBase(MNames.MATTER_SCANNER) { color, _ -> MatterScannerBlock(color) } - val MATTER_PANEL: Block by registry.register(MNames.MATTER_PANEL) { MatterPanelBlock() } - val MATTER_REPLICATOR = registry.coloredWithBase(MNames.MATTER_REPLICATOR) { color, _ -> MatterReplicatorBlock(color) } - val MATTER_BOTTLER = registry.coloredWithBase(MNames.MATTER_BOTTLER) { color, _ -> MatterBottlerBlock(color) } - val ENERGY_COUNTER: Block by registry.register(MNames.ENERGY_COUNTER) { EnergyCounterBlock() } - val CHEMICAL_GENERATOR: Block by registry.register(MNames.CHEMICAL_GENERATOR) { ChemicalGeneratorBlock() } - val PLATE_PRESS = registry.coloredWithBase(MNames.PLATE_PRESS) { color, _ -> PlatePressBlock(color) } - val TWIN_PLATE_PRESS = registry.coloredWithBase(MNames.TWIN_PLATE_PRESS) { color, _ -> PlatePressBlock(color, isTwin = true) } - val POWERED_FURNACE = registry.coloredWithBase(MNames.POWERED_FURNACE) { color, _ -> PoweredFurnaceBlock(color) } - val POWERED_BLAST_FURNACE = registry.coloredWithBase(MNames.POWERED_BLAST_FURNACE) { color, _ -> PoweredBlastFurnaceBlock(color) } - val POWERED_SMOKER = registry.coloredWithBase(MNames.POWERED_SMOKER) { color, _ -> PoweredSmokerBlock(color) } - val MATTER_RECYCLER = registry.coloredWithBase(MNames.MATTER_RECYCLER) { color, _ -> MatterRecyclerBlock(color) } - val ENERGY_SERVO: Block by registry.register(MNames.ENERGY_SERVO) { EnergyServoBlock() } - val COBBLESTONE_GENERATOR = registry.coloredWithBase(MNames.COBBLESTONE_GENERATOR) { color, _ -> CobblerBlock(color) } - val INFINITE_WATER_SOURCE: Block by registry.register(MNames.INFINITE_WATER_SOURCE) { InfiniteWaterSourceBlock() } - val ESSENCE_STORAGE = registry.coloredWithBase(MNames.ESSENCE_STORAGE) { color, _ -> EssenceStorageBlock(color) } - val MATTER_RECONSTRUCTOR = registry.coloredWithBase(MNames.MATTER_RECONSTRUCTOR) { color, _ -> MatterReconstructorBlock(color) } - val PAINTER: PainterBlock by registry.register(MNames.PAINTER) { PainterBlock() } + val ANDROID_STATION = registry.coloredWithBase(MNames.ANDROID_STATION, ::AndroidStationBlock) + val ANDROID_CHARGER = registry.coloredWithBase(MNames.ANDROID_CHARGER, ::AndroidChargerBlock) + val BATTERY_BANK = registry.coloredWithBase(MNames.BATTERY_BANK, ::BatteryBankBlock) + val MATTER_DECOMPOSER = registry.coloredWithBase(MNames.MATTER_DECOMPOSER, ::MatterDecomposerBlock) + val MATTER_CAPACITOR_BANK = registry.coloredWithBase(MNames.MATTER_CAPACITOR_BANK, ::MatterCapacitorBankBlock) + val MATTER_CABLE by registry.register(MNames.MATTER_CABLE, ::MatterCableBlock) + val PATTERN_STORAGE by registry.register(MNames.PATTERN_STORAGE, ::PatternStorageBlock) + val MATTER_SCANNER = registry.coloredWithBase(MNames.MATTER_SCANNER, ::MatterScannerBlock) + val MATTER_PANEL = registry.coloredWithBase(MNames.MATTER_PANEL, ::MatterPanelBlock) + val MATTER_REPLICATOR = registry.coloredWithBase(MNames.MATTER_REPLICATOR, ::MatterReplicatorBlock) + val MATTER_BOTTLER = registry.coloredWithBase(MNames.MATTER_BOTTLER, ::MatterBottlerBlock) + val ENERGY_COUNTER by registry.register(MNames.ENERGY_COUNTER, ::EnergyCounterBlock) + val CHEMICAL_GENERATOR by registry.register(MNames.CHEMICAL_GENERATOR, ::ChemicalGeneratorBlock) + val PLATE_PRESS = registry.coloredWithBase(MNames.PLATE_PRESS, ::PlatePressBlock) + val TWIN_PLATE_PRESS = registry.coloredWithBase(MNames.TWIN_PLATE_PRESS) { color -> PlatePressBlock(color, isTwin = true) } + val POWERED_FURNACE = registry.coloredWithBase(MNames.POWERED_FURNACE, ::PoweredFurnaceBlock) + val POWERED_BLAST_FURNACE = registry.coloredWithBase(MNames.POWERED_BLAST_FURNACE, ::PoweredBlastFurnaceBlock) + val POWERED_SMOKER = registry.coloredWithBase(MNames.POWERED_SMOKER, ::PoweredSmokerBlock) + val MATTER_RECYCLER = registry.coloredWithBase(MNames.MATTER_RECYCLER, ::MatterRecyclerBlock) + val ENERGY_SERVO by registry.register(MNames.ENERGY_SERVO, ::EnergyServoBlock) + val COBBLESTONE_GENERATOR = registry.coloredWithBase(MNames.COBBLESTONE_GENERATOR, ::CobblerBlock) + val INFINITE_WATER_SOURCE by registry.register(MNames.INFINITE_WATER_SOURCE) { InfiniteWaterSourceBlock() } + val ESSENCE_STORAGE = registry.coloredWithBase(MNames.ESSENCE_STORAGE, ::EssenceStorageBlock) + val MATTER_RECONSTRUCTOR = registry.coloredWithBase(MNames.MATTER_RECONSTRUCTOR, ::MatterReconstructorBlock) + val PAINTER by registry.register(MNames.PAINTER, ::PainterBlock) val MATTER_ENTANGLER: MatterEntanglerBlock by registry.register(MNames.MATTER_ENTANGLER) { MatterEntanglerBlock() } val ENERGY_CABLES: Map = SupplierMap(CablesConfig.E.entries.map { conf -> conf to registry.register("${conf.name.lowercase()}_energy_cable") { EnergyCableBlock { a, b -> MBlockEntities.ENERGY_CABLES[conf]!!.create(a, b)!! } } }) - val STORAGE_BUS: Block by registry.register(MNames.STORAGE_BUS) { StorageBusBlock() } - val STORAGE_IMPORTER: Block by registry.register(MNames.STORAGE_IMPORTER) { StorageImporterBlock() } - val STORAGE_EXPORTER: Block by registry.register(MNames.STORAGE_EXPORTER) { StorageExporterBlock() } + val STORAGE_BUS: Block by registry.register(MNames.STORAGE_BUS, ::StorageBusBlock) + val STORAGE_IMPORTER: Block by registry.register(MNames.STORAGE_IMPORTER, ::StorageImporterBlock) + val STORAGE_EXPORTER: Block by registry.register(MNames.STORAGE_EXPORTER, ::StorageExporterBlock) - val DRIVE_VIEWER: Block by registry.register(MNames.DRIVE_VIEWER) { DriveViewerBlock() } - val DRIVE_RACK: Block by registry.register(MNames.DRIVE_RACK) { DriveRackBlock() } - val ITEM_MONITOR = registry.coloredWithBase(MNames.ITEM_MONITOR) { color, _ -> ItemMonitorBlock(color) } - val STORAGE_CABLE: Block by registry.register(MNames.STORAGE_CABLE) { StorageCableBlock() } - val STORAGE_POWER_SUPPLIER: Block by registry.register(MNames.STORAGE_POWER_SUPPLIER) { StoragePowerSupplierBlock() } + val DRIVE_VIEWER = registry.coloredWithBase(MNames.DRIVE_VIEWER, ::DriveViewerBlock) + val DRIVE_RACK: Block by registry.register(MNames.DRIVE_RACK, ::DriveRackBlock) + val ITEM_MONITOR = registry.coloredWithBase(MNames.ITEM_MONITOR, ::ItemMonitorBlock) + val STORAGE_CABLE: Block by registry.register(MNames.STORAGE_CABLE, ::StorageCableBlock) + val STORAGE_POWER_SUPPLIER = registry.coloredWithBase(MNames.STORAGE_POWER_SUPPLIER, ::StoragePowerSupplierBlock) val DEBUG_EXPLOSION_SMALL: Block by registry.register(MNames.DEBUG_EXPLOSION_SMALL) { BlockExplosionDebugger() } val DEBUG_SPHERE_POINTS: Block by registry.register(MNames.DEBUG_SPHERE_POINTS) { BlockSphereDebugger() } @@ -218,11 +218,9 @@ object MBlocks { TRITANIUM_ANVIL = SupplierList(anvils) } - val TRITANIUM_DOOR: Map = registry.coloredWithBase(MNames.TRITANIUM_DOOR) { color, _ -> - TritaniumDoorBlock(color) } + val TRITANIUM_DOOR = registry.coloredWithBase(MNames.TRITANIUM_DOOR, ::TritaniumDoorBlock) - val TRITANIUM_TRAPDOOR: Map = registry.coloredWithBase(MNames.TRITANIUM_TRAPDOOR) { color, _ -> - TritaniumTrapdoorBlock(color) } + val TRITANIUM_TRAPDOOR = registry.coloredWithBase(MNames.TRITANIUM_TRAPDOOR, ::TritaniumTrapdoorBlock) val TRITANIUM_STRIPED_BLOCK: Block by registry.register(MNames.TRITANIUM_STRIPED_BLOCK) { Block( BlockBehaviour.Properties.of() diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MEntityTypes.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MEntityTypes.kt index 47cad1f74..dcdb9d758 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MEntityTypes.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MEntityTypes.kt @@ -23,8 +23,8 @@ object MEntityTypes { EntityType.Builder.of({ _, level -> PlasmaProjectile(level) }, MobCategory.MISC).sized(0.4f, 0.4f).build(MNames.PLASMA) } - val CARGO_CRATE_MINECARTS = registry.coloredWithBase(MNames.MINECART_CARGO_CRATE) { color, name -> - EntityType.Builder.of({ it, level -> MinecartCargoCrate(it, color, level)}, MobCategory.MISC).sized(0.98F, 0.7F).clientTrackingRange(8).build(name) + val CARGO_CRATE_MINECARTS = registry.coloredWithBase(MNames.MINECART_CARGO_CRATE) { color -> + EntityType.Builder.of({ it, level -> MinecartCargoCrate(it, color, level)}, MobCategory.MISC).sized(0.98F, 0.7F).clientTrackingRange(8).build("dfu doesn't works ✅") } internal fun register(bus: IEventBus) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt index edbe1b5a5..087c24a1b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt @@ -6,13 +6,16 @@ import net.minecraft.network.chat.Component import net.minecraft.resources.ResourceLocation import net.minecraft.world.food.FoodProperties import net.minecraft.world.item.* +import net.minecraft.world.item.Item.Properties import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.level.Level +import net.minecraft.world.level.block.Block import net.minecraftforge.common.ForgeTier import net.minecraftforge.common.TierSortingRegistry import net.minecraftforge.eventbus.api.IEventBus import net.minecraftforge.registries.DeferredRegister import net.minecraftforge.registries.ForgeRegistries +import net.minecraftforge.registries.RegistryObject import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.capability.ITieredUpgradeSet import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability @@ -44,9 +47,13 @@ import ru.dbotthepony.mc.otm.item.weapon.PlasmaRifleItem import java.util.function.Supplier object MItems { - private val DEFAULT_PROPERTIES = Item.Properties() + private val DEFAULT_PROPERTIES = Properties() private val registry: DeferredRegister = DeferredRegister.create(ForgeRegistries.ITEMS, OverdriveThatMatters.MOD_ID) + private fun register(name: String, blocks: Map, properties: Properties = DEFAULT_PROPERTIES): Map { + return registry.coloredWithBase(name) { color -> BlockItem(blocks[color]!!, properties) } + } + internal fun register(bus: IEventBus) { registry.register(bus) } @@ -55,49 +62,49 @@ object MItems { conf to registry.register("${conf.name.lowercase()}_energy_cable") { BlockItem(MBlocks.ENERGY_CABLES[conf]!!, DEFAULT_PROPERTIES) } }) - val ANDROID_STATION = registry.coloredWithBase(MNames.ANDROID_STATION) { color, _ -> BlockItem(MBlocks.ANDROID_STATION[color]!!, DEFAULT_PROPERTIES) } - val ANDROID_CHARGER: BlockItem by registry.register(MNames.ANDROID_CHARGER) { BlockItem(MBlocks.ANDROID_CHARGER, DEFAULT_PROPERTIES) } - val BATTERY_BANK = registry.coloredWithBase(MNames.BATTERY_BANK) { color, _ -> BlockItem(MBlocks.BATTERY_BANK[color]!!, DEFAULT_PROPERTIES) } - val MATTER_DECOMPOSER = registry.coloredWithBase(MNames.MATTER_DECOMPOSER) { color, _ -> BlockItem(MBlocks.MATTER_DECOMPOSER[color]!!, DEFAULT_PROPERTIES) } - val MATTER_CAPACITOR_BANK = registry.coloredWithBase(MNames.MATTER_CAPACITOR_BANK) { color, _ -> BlockItem(MBlocks.MATTER_CAPACITOR_BANK[color]!!, DEFAULT_PROPERTIES) } + val ANDROID_STATION = register(MNames.ANDROID_STATION, MBlocks.ANDROID_STATION) + val ANDROID_CHARGER = register(MNames.ANDROID_CHARGER, MBlocks.ANDROID_CHARGER) + val BATTERY_BANK = register(MNames.BATTERY_BANK, MBlocks.BATTERY_BANK) + val MATTER_DECOMPOSER = register(MNames.MATTER_DECOMPOSER, MBlocks.MATTER_DECOMPOSER) + val MATTER_CAPACITOR_BANK = register(MNames.MATTER_CAPACITOR_BANK, MBlocks.MATTER_CAPACITOR_BANK) val MATTER_CABLE: BlockItem by registry.register(MNames.MATTER_CABLE) { BlockItem(MBlocks.MATTER_CABLE, DEFAULT_PROPERTIES) } val PATTERN_STORAGE: BlockItem by registry.register(MNames.PATTERN_STORAGE) { BlockItem(MBlocks.PATTERN_STORAGE, DEFAULT_PROPERTIES) } - val MATTER_SCANNER = registry.coloredWithBase(MNames.MATTER_SCANNER) { color, _ -> BlockItem(MBlocks.MATTER_SCANNER[color]!!, DEFAULT_PROPERTIES) } - val MATTER_PANEL: BlockItem by registry.register(MNames.MATTER_PANEL) { BlockItem(MBlocks.MATTER_PANEL, DEFAULT_PROPERTIES) } - val MATTER_REPLICATOR = registry.coloredWithBase(MNames.MATTER_REPLICATOR) { color, _ -> BlockItem(MBlocks.MATTER_REPLICATOR[color]!!, DEFAULT_PROPERTIES) } - val MATTER_BOTTLER = registry.coloredWithBase(MNames.MATTER_BOTTLER) { color, _ -> BlockItem(MBlocks.MATTER_BOTTLER[color]!!, DEFAULT_PROPERTIES) } + val MATTER_SCANNER = register(MNames.MATTER_SCANNER, MBlocks.MATTER_SCANNER) + val MATTER_PANEL = register(MNames.MATTER_PANEL, MBlocks.MATTER_PANEL) + val MATTER_REPLICATOR = register(MNames.MATTER_REPLICATOR, MBlocks.MATTER_REPLICATOR) + val MATTER_BOTTLER = register(MNames.MATTER_BOTTLER, MBlocks.MATTER_BOTTLER) val TRITANIUM_ORE: BlockItem by registry.register(MNames.TRITANIUM_ORE) { BlockItem(MBlocks.TRITANIUM_ORE, DEFAULT_PROPERTIES) } val DEEPSLATE_TRITANIUM_ORE: BlockItem by registry.register(MNames.DEEPSLATE_TRITANIUM_ORE) { BlockItem(MBlocks.DEEPSLATE_TRITANIUM_ORE, DEFAULT_PROPERTIES) } val TRITANIUM_RAW_BLOCK: BlockItem by registry.register(MNames.TRITANIUM_RAW_BLOCK) { BlockItem(MBlocks.TRITANIUM_RAW_BLOCK, DEFAULT_PROPERTIES) } val ENERGY_COUNTER: BlockItem by registry.register(MNames.ENERGY_COUNTER) { BlockItem(MBlocks.ENERGY_COUNTER, DEFAULT_PROPERTIES) } val CHEMICAL_GENERATOR: BlockItem by registry.register(MNames.CHEMICAL_GENERATOR) { BlockItem(MBlocks.CHEMICAL_GENERATOR, DEFAULT_PROPERTIES) } - val PLATE_PRESS = registry.coloredWithBase(MNames.PLATE_PRESS) { color, _ -> BlockItem(MBlocks.PLATE_PRESS[color]!!, DEFAULT_PROPERTIES) } - val TWIN_PLATE_PRESS = registry.coloredWithBase(MNames.TWIN_PLATE_PRESS) { color, _ -> BlockItem(MBlocks.TWIN_PLATE_PRESS[color]!!, DEFAULT_PROPERTIES) } - val MATTER_RECYCLER = registry.coloredWithBase(MNames.MATTER_RECYCLER) { color, _ -> BlockItem(MBlocks.MATTER_RECYCLER[color]!!, DEFAULT_PROPERTIES) } + val PLATE_PRESS = register(MNames.PLATE_PRESS, MBlocks.PLATE_PRESS) + val TWIN_PLATE_PRESS = register(MNames.TWIN_PLATE_PRESS, MBlocks.TWIN_PLATE_PRESS) + val MATTER_RECYCLER = register(MNames.MATTER_RECYCLER, MBlocks.MATTER_RECYCLER) - val POWERED_FURNACE = registry.coloredWithBase(MNames.POWERED_FURNACE) { color, _ -> BlockItem(MBlocks.POWERED_FURNACE[color]!!, DEFAULT_PROPERTIES) } - val POWERED_BLAST_FURNACE = registry.coloredWithBase(MNames.POWERED_BLAST_FURNACE) { color, _ -> BlockItem(MBlocks.POWERED_BLAST_FURNACE[color]!!, DEFAULT_PROPERTIES) } - val POWERED_SMOKER = registry.coloredWithBase(MNames.POWERED_SMOKER) { color, _ -> BlockItem(MBlocks.POWERED_SMOKER[color]!!, DEFAULT_PROPERTIES) } + val POWERED_FURNACE = register(MNames.POWERED_FURNACE, MBlocks.POWERED_FURNACE) + val POWERED_BLAST_FURNACE = register(MNames.POWERED_BLAST_FURNACE, MBlocks.POWERED_BLAST_FURNACE) + val POWERED_SMOKER = register(MNames.POWERED_SMOKER, MBlocks.POWERED_SMOKER) val STORAGE_BUS: BlockItem by registry.register(MNames.STORAGE_BUS) { BlockItem(MBlocks.STORAGE_BUS, DEFAULT_PROPERTIES) } val STORAGE_IMPORTER: BlockItem by registry.register(MNames.STORAGE_IMPORTER) { BlockItem(MBlocks.STORAGE_IMPORTER, DEFAULT_PROPERTIES) } val STORAGE_EXPORTER: BlockItem by registry.register(MNames.STORAGE_EXPORTER) { BlockItem(MBlocks.STORAGE_EXPORTER, DEFAULT_PROPERTIES) } - val DRIVE_VIEWER: BlockItem by registry.register(MNames.DRIVE_VIEWER) { BlockItem(MBlocks.DRIVE_VIEWER, DEFAULT_PROPERTIES) } + val DRIVE_VIEWER = register(MNames.DRIVE_VIEWER, MBlocks.DRIVE_VIEWER) val DRIVE_RACK: BlockItem by registry.register(MNames.DRIVE_RACK) { BlockItem(MBlocks.DRIVE_RACK, DEFAULT_PROPERTIES) } - val ITEM_MONITOR = registry.coloredWithBase(MNames.ITEM_MONITOR) { color, _ -> BlockItem(MBlocks.ITEM_MONITOR[color]!!, DEFAULT_PROPERTIES) } + val ITEM_MONITOR = register(MNames.ITEM_MONITOR, MBlocks.ITEM_MONITOR) val STORAGE_CABLE: BlockItem by registry.register(MNames.STORAGE_CABLE) { BlockItem(MBlocks.STORAGE_CABLE, DEFAULT_PROPERTIES) } - val STORAGE_POWER_SUPPLIER: BlockItem by registry.register(MNames.STORAGE_POWER_SUPPLIER) { BlockItem(MBlocks.STORAGE_POWER_SUPPLIER, DEFAULT_PROPERTIES) } + val STORAGE_POWER_SUPPLIER = register(MNames.STORAGE_POWER_SUPPLIER, MBlocks.STORAGE_POWER_SUPPLIER) val GRAVITATION_STABILIZER: BlockItem by registry.register(MNames.GRAVITATION_STABILIZER) { BlockItem(MBlocks.GRAVITATION_STABILIZER, DEFAULT_PROPERTIES) } val PHANTOM_ATTRACTOR: DoubleHighBlockItem by registry.register(MNames.PHANTOM_ATTRACTOR) { DoubleHighBlockItem(MBlocks.PHANTOM_ATTRACTOR, DEFAULT_PROPERTIES) } val ENERGY_SERVO: BlockItem by registry.register(MNames.ENERGY_SERVO) { BlockItem(MBlocks.ENERGY_SERVO, DEFAULT_PROPERTIES) } - val COBBLESTONE_GENERATOR: Map = registry.coloredWithBase(MNames.COBBLESTONE_GENERATOR) { color, _ -> BlockItem(MBlocks.COBBLESTONE_GENERATOR[color]!!, DEFAULT_PROPERTIES) } + val COBBLESTONE_GENERATOR = register(MNames.COBBLESTONE_GENERATOR, MBlocks.COBBLESTONE_GENERATOR) val INFINITE_WATER_SOURCE: BlockItem by registry.register(MNames.INFINITE_WATER_SOURCE) { BlockItem(MBlocks.INFINITE_WATER_SOURCE, DEFAULT_PROPERTIES) } - val ESSENCE_STORAGE: Map = registry.coloredWithBase(MNames.ESSENCE_STORAGE) { color, _ -> BlockItem(MBlocks.ESSENCE_STORAGE[color]!!, DEFAULT_PROPERTIES) } - val MATTER_RECONSTRUCTOR = registry.coloredWithBase(MNames.MATTER_RECONSTRUCTOR) { color, _ -> BlockItem(MBlocks.MATTER_RECONSTRUCTOR[color]!!, DEFAULT_PROPERTIES) } + val ESSENCE_STORAGE = register(MNames.ESSENCE_STORAGE, MBlocks.ESSENCE_STORAGE) + val MATTER_RECONSTRUCTOR = register(MNames.MATTER_RECONSTRUCTOR, MBlocks.MATTER_RECONSTRUCTOR) val DEV_CHEST: BlockItem by registry.register(MNames.DEV_CHEST) { BlockItem(MBlocks.DEV_CHEST, DEFAULT_PROPERTIES) } val PAINTER: BlockItem by registry.register(MNames.PAINTER) { BlockItem(MBlocks.PAINTER, DEFAULT_PROPERTIES) } @@ -115,7 +122,7 @@ object MItems { machines.addAll(POWERED_SMOKER.asSupplierArray()) machines.addAll(ANDROID_STATION.asSupplierArray().iterator()) - machines.add(::ANDROID_CHARGER) + machines.addAll(ANDROID_CHARGER.asSupplierArray().iterator()) machines.addAll(BATTERY_BANK.asSupplierArray().iterator()) machines.add(::ENERGY_COUNTER) machines.add(::CHEMICAL_GENERATOR) @@ -130,7 +137,7 @@ object MItems { machines.add(::MATTER_CABLE) machines.add(::PATTERN_STORAGE) machines.addAll(MATTER_SCANNER.asSupplierArray().iterator()) - machines.add(::MATTER_PANEL) + machines.addAll(MATTER_PANEL.asSupplierArray().iterator()) machines.addAll(MATTER_REPLICATOR.asSupplierArray().iterator()) machines.addAll(MATTER_BOTTLER.asSupplierArray().iterator()) machines.add(::MATTER_ENTANGLER) @@ -139,11 +146,11 @@ object MItems { machines.add(::STORAGE_BUS) machines.add(::STORAGE_IMPORTER) machines.add(::STORAGE_EXPORTER) - machines.add(::DRIVE_VIEWER) + machines.addAll(DRIVE_VIEWER.asSupplierArray().iterator()) machines.add(::DRIVE_RACK) machines.addAll(ITEM_MONITOR.asSupplierArray().iterator()) machines.add(::STORAGE_CABLE) - machines.add(::STORAGE_POWER_SUPPLIER) + machines.addAll(STORAGE_POWER_SUPPLIER.asSupplierArray().iterator()) MACHINES = SupplierList(machines) } @@ -438,8 +445,8 @@ object MItems { val ENGINE: Item by registry.register(MNames.ENGINE) { BlockItem(MBlocks.ENGINE, DEFAULT_PROPERTIES) } val HOLO_SIGN: Item by registry.register(MNames.HOLO_SIGN) { BlockItem(MBlocks.HOLO_SIGN, DEFAULT_PROPERTIES) } - val TRITANIUM_DOOR = registry.coloredWithBase(MNames.TRITANIUM_DOOR) { color, _ -> DoubleHighBlockItem(MBlocks.TRITANIUM_DOOR[color]!!, DEFAULT_PROPERTIES) } - val TRITANIUM_TRAPDOOR = registry.coloredWithBase(MNames.TRITANIUM_TRAPDOOR) { color, _ -> BlockItem(MBlocks.TRITANIUM_TRAPDOOR[color]!!, DEFAULT_PROPERTIES) } + val TRITANIUM_DOOR = register(MNames.TRITANIUM_DOOR, MBlocks.TRITANIUM_DOOR) + val TRITANIUM_TRAPDOOR = register(MNames.TRITANIUM_TRAPDOOR, MBlocks.TRITANIUM_TRAPDOOR) // components val MATTER_IO_PORT: Item by registry.register(MNames.MATTER_IO_PORT) { Item(DEFAULT_PROPERTIES) } @@ -529,7 +536,7 @@ object MItems { ::REINFORCED_TRITANIUM_PLATE, ) - val CARGO_CRATE_MINECARTS = registry.coloredWithBase(MNames.MINECART_CARGO_CRATE) { color, _ -> MinecartCargoCrateItem(color) } + val CARGO_CRATE_MINECARTS = registry.coloredWithBase(MNames.MINECART_CARGO_CRATE, ::MinecartCargoCrateItem) val EXOPACK_PROBE: Item by registry.register(MNames.EXOPACK_PROBE, ::ExopackProbeItem) diff --git a/src/main/resources/assets/overdrive_that_matters/blockstates/matter_panel.json b/src/main/resources/assets/overdrive_that_matters/blockstates/matter_panel.json deleted file mode 100644 index 781d76141..000000000 --- a/src/main/resources/assets/overdrive_that_matters/blockstates/matter_panel.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "variants": { - "facing=south": { - "model": "overdrive_that_matters:block/matter_panel" - }, - "facing=up": { - "model": "overdrive_that_matters:block/matter_panel", - "x": 90 - }, - "facing=down": { - "model": "overdrive_that_matters:block/matter_panel", - "x": 270 - }, - "facing=west": { - "model": "overdrive_that_matters:block/matter_panel", - "y": 90 - }, - "facing=north": { - "model": "overdrive_that_matters:block/matter_panel", - "y": 180 - }, - "facing=east": { - "model": "overdrive_that_matters:block/matter_panel", - "y": 270 - } - } -} diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/black.png b/src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/black.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3614c247b118e186da3506914a5fdb5d039073 GIT binary patch literal 836 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 Hl+XkKk@hxM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/light_blue.png b/src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/light_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..452a44a35c9fbf2dec3acad97074e3c9e37d5465 GIT binary patch literal 836 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3-pQ0$S$)DVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C%fh@Ck7R(nUo@2?+_> z+S;b3rtR(RAt53EA9()1!Jww5raxi5(X2h%EeplO#0m-u>g((O|NsA}+UpHa8)He3 zUoeBivm0q3PLj8~i@?-PygEP*XMsm#F#`kNVGw3Kp1&dmD9B#o>Fdh=f{{f)N_b7l z)Vn}EJ3L(+Lp+Ypo!outwE{Axvv1p?6)1Dg&yah z%Elh(WsYS0C3Jh6ZiCU9+?OA?MBbiO)7~)C-IQ;=Qqqb?F>DjR-l}$Set20UrJ--a z6h=Px#Rr&N7U^GX7i}o`!_&vWwBg4E_Gt_?m#>F28r5X%UGw+>qeJG3z<<{ZUN=a5 zp83Rj5!02a9_LG=yBgRT@(#WB`oPOj&+ws4EHUmxcPG~swUvx9mz_nwHCXXD`ug?-`X4`Y_|&9C&wx+c*i8GXdw$6` zZcygi_%mA&7_F)$t`Q|Ei6yC4$wjF^iowXh$VAt`5Qsty&8!SSNZY``%D|v%^8B|b z8glbfGSez?Yv4Yo9thN+0k@$fGdH!kBr&%Dp~nPdiIJI=p(Vr;7ak!!pdJQKS3j3^ HP6 z+S;b3rtR(RAt53EA9()1!Jww5R#1>pQBjbdo**VBR!~q-Utj@nKwp0yT?(< zWNuDvzL>-NgvoNUc?|~-?)+bpps+}tecKkTK$&X?)*jyWR=fSqlY0zD7v^s&^f>=i zHugX-b0p(0q1)SZ8;sWEzWl%?^7gcv_J*16rhMy_l2$y5VVn5%R<(=s!^;{e4Sf@) zF!H%CKEUL%NdIEHXhXpto<0Vq4L>fhPh+ULd_A1es3v3Yn#T_q9Wqx0{<~iAxcj&d(2VRDHh7V<8u>s|qGZsx-prLlMg5^PGL_l%~`;23} z_UwXhTs=BwY0J;G$X%?#I7Pf>&e8J^nc5;__(~XmsXadB%Qvg}-o$4HUk^x5m}c63 zl2J$?KsDUpD?{bglBKt0K9$)#amcp}X%FSAU~IVj!tdJGri?tz?Y3>@51N!HUPx*S9aw|M;21rzRzO27KDaX4+TX^Gm*Q zgEHU7pV@-IXjLt7jVMV;EJ?LWE=mPb3`Pb9nO2Eg1NS-gK%fQ z+S;b3rtR(RAt53EA9()1!Jww57BN*get}3}r=XaaSV2KSeSQ7^|NkcnwAli+F_r}R z1v5B2yO9RsBze2L2u$6?s{`b47I;J!GcfQS24TkI`72U@g6t)pzOL*q7+D0Qgx8cz zy$jT{!_&nv#N+tf$=#P;D{!=kPH>T){k{ISa>knJGtSg+GoBl>Pj5#+GH;B0c8{Zy z$=saUd@+aj36tey^BN8w-1)yGL1B?P`?f7wfil+)tUbK#t#CP5IUdmemKQ>mP(v- z@5{7Pj%jg>U;aH0IQDj8RORi}3~_xAjvl`Kxn#MwmH+H@!V3G7O{k8Ee2kP*AMP^cXC}(Tge!6*;({kgB6dXuWw(V|M4@2Pfben4EVH-&9tw&=a+or z24%jDKeGja(W+YF8c~vxSdwa$T$Bo=7>o>zOmqzlfhfe#%*p_Sv<(cb3=FC!&wq=e zAvZrIGp!Q02JUm}fj|u!a2rZ8b5n~;5_1a>dQ3o;7@1iaT0$&w;StgU>S6G7^>bP0 Hl+XkKtBE#R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/magenta.png b/src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/magenta.png new file mode 100644 index 0000000000000000000000000000000000000000..de244e9a8955e6c893685d5c2ae6a51d59016cc7 GIT binary patch literal 836 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3-pQ0$S$)DVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C%fh@Ck7R(nUo@2?+_> z+S;b3rtR(RAt53EA9()1!Jww5HpQrCzS*=+y+$!Hv4Vnv`uh6+|No!g=NbUi##j>M z7tG-B>_!@hljQC0A~1CmuMUvIS>O>_%)r2R7=#&*=dVZs3bL1Y`ns~eU}O=H5?)g> z^)67)4o?@y5RcAMH_V@bR${A~>&p1=R&3JCiKD`|Q$-FW0**%U* zCUbLY^TizACrp-;&1*P#aOeM$1cgQF?Ax|z1qK@bob-ZTNA4eHuf}$Ml~6G*F1i}=#aT0@Za@<*9{V% zXFjoB#B^n<$NAFet_F67yhE?OKJYTsGkho$iw!8>oUv%y0u8m36)X=jBLb2`*k>H$ zwPzQ6;W$kY}Y!&k!iOYQL~U%pw*_a;6w_1!K#_aMvX_8y8JCUe@$N`Qa4jSt@bT zy)V;FIi|%ie);!2;Mm)VQI)q>GsN{hIC}W@=aS{#R{pcs2`lVRmS6mwX@?SHOd-Qf zs}l{YwHSCEUO%|w-N|)DZ6#yOWoOZE4OTpkzP^2d{>RT8J~b)PGvL!UHq*Z9o?r5f z8&BxMyqOxYeY#(Vo9o1a#1RfVlXl=GSM|K1fmc_Gb;lS(l#)#GBBu`JpV0< zhTQy=%(P0}8o1A?2Ld%{z-=hW%uOvWNz5%k=rI9VVq|7zXbG{zg-1vasE5JR)z4*} HQ$iB}O3FA7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/orange.png b/src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/orange.png new file mode 100644 index 0000000000000000000000000000000000000000..87155d47e5a9921e38c9b258ab46a9edaca626b9 GIT binary patch literal 836 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3-pQ0$S$)DVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C%fh@Ck7R(nUo@2?+_> z+S;b3rtR(RAt53EA9()1!Jww5b|i-9QZnzBP;N0Xv4Vnv`uh6+|NkFhHmd?^V=M{s z3ubV5b|VeMN%D4g5tzD(R|m-9EbxddW?>fuY zlesyy`C<<56DG^a<~1BVxbuHWg2Ezo_HA3V0%fipSbKQeTkZBcPwp`sU6{YA(Bu45 z+1LZU%#n=0gl=!sZ7^Ds`|<;q$lKFu+8buNoARw!N?P$KhHc{4Th%Vk4=-z^H1tiF z!pP^o_yCj3BK?c)q74Oqc={NaHvG82K8>N~^7U{=qneDpYaTyfbjVy0`0skb>jsI> zGoM&5V!ATb<9um!R|7jk-l5lCA9xw+89tPW#Rimb&R8^Ufri@23YG_%5dp~|>@$w> z+OrG3arNk!r7b_#B6qO{;}r3lIY-YwWNM3y;VWVMrS|xgFW;=@dlR1-d_5pJVVY_C zNk$=o0M&4VuMCw}OP1c2`BY}}#3A1@q&<|cg0badxa*RejfgTe~ HDWM4fNi;U` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/pink.png b/src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/pink.png new file mode 100644 index 0000000000000000000000000000000000000000..39fbde8d31ed4fd429f53307c11facb849379313 GIT binary patch literal 836 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3-pQ0$S$)DVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C%fh@Ck7R(nUo@2?+_> z+S;b3rtR(RAt53EA9()1!Jww5b|}B&Liwc4X|-ZvVg&^S_4W1t|Nj?1_h&g!8)He3 zUoeBivm0q3PLj8~i@?-PygEP*XMsm#F#`kNVGw3Kp1&dmD9B#o>Fdh=f{{f)N_b7l z)Vn}EJ3L(+Lp+Ypo!outwE{Axvv1p?6)1Dg&yah z%Elh(WsYS0C3Jh6ZiCU9+?OA?MBbiO)7~)C-IQ;=Qqqb?F>DjR-l}$Set20UrJ--a z6h=Px#Rr&N7U^GX7i}o`!_&vWwBg4E_Gt_?m#>F28r5X%UGw+>qeJG3z<<{ZUN=a5 zp83Rj5!02a9_LG=yBgRT@(#WB`oPOj&+ws4EHUmxcPG~swUvx9mz_nwHCXXD`ug?-`X4`Y_|&9C&wx+c*i8GXdw$6` zZcygi_%mA&7_F)$t`Q|Ei6yC4$wjF^iowXh$VAt`5Qsty&8!SSNZY``%D|v%^8B|b z8glbfGSez?Yv4Yo9thN+0k@$fGdH!kBr&%Dp~nPdiIJI=p(Vr;7ak!!pdJQKS3j3^ HP6 z+S;b3rtR(RAt53EA9()1!Jww579-c5tS~WDrbbLmte~KvzP|qd|NpO-Y<>jP##j>M z7tG-B>_!@hljQC0A~1CmuMUvIS>O>_%)r2R7=#&*=dVZs3bL1Y`ns~eU}O=H5?)g> z^)67)4o?@y5RcAMH_V@bR${A~>&p1=R&3JCiKD`|Q$-FW0**%U* zCUbLY^TizACrp-;&1*P#aOeM$1cgQF?Ax|z1qK@bob-ZTNA4eHuf}$Ml~6G*F1i}=#aT0@Za@<*9{V% zXFjoB#B^n<$NAFet_F67yhE?OKJYTsGkho$iw!8>oUv%y0u8m36)X=jBLb2`*k>H$ zwPzQ6;W$kY}Y!&k!iOYQL~U%pw*_a;6w_1!K#_aMvX_8y8JCUe@$N`Qa4jSt@bT zy)V;FIi|%ie);!2;Mm)VQI)q>GsN{hIC}W@=aS{#R{pcs2`lVRmS6mwX@?SHOd-Qf zs}l{YwHSCEUO%|w-N|)DZ6#yOWoOZE4OTpkzP^2d{>RT8J~b)PGvL!UHq*Z9o?r5f z8&BxMyqOxYeY#(Vo9o1a#1RfVlXl=GSM|K1fmc_Gb;lS(l#)#GBBu`JpV0< zhTQy=%(P0}8o1A?2Ld%{z-=hW%uOvWNz5%k=rI9VVq|7zXbG{zg-1vasE5JR)z4*} HQ$iB}Uzj)^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/red.png b/src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/red.png new file mode 100644 index 0000000000000000000000000000000000000000..ae710307222762051ea8753d03d47a93e4892df4 GIT binary patch literal 836 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3-pQ0$S$)DVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C%fh@Ck7R(nUo@2?+_> z+S;b3rtR(RAt53EA9()1!Jww5RwFCjDlc0sEh#1@R!~q-UtjYfvKB#b$}es0*}aI1_r*vAk26?e?j#+mwU#&cu#>Fo$e=8cih?r~Hy znVVCaFXr$*VX~ZTUc(->+lUk_(As>#^9=J5kYhs+g$|E?FjZjksq z^NIB$rYloD&X-1aHLx?}9eVBcftR74;X|2NY(V+uj78HHXsDg6V0n-k5s)0hKI0g# zJ-gr=SC5Wa+VXQPau;hbP7$w}bM*W}rnbl!z7ob?YL8F(^37_#H}RRl*8`FhrkS>% zWE2tzPz^Wu%20W=Wa(|0Ph~bw9P%wg+C%v&7+WreyDquexM;fZvZfcx52rZKQi+r9 zeVKO3F)fbq%fIIV$KFnis=U3LA+GPi(Zjbtmn`?T@}Ip3K?!% zooHCC#lY+E`oSIVPOd9zD;Z-hJBxm6u;Ov__3aDvKYr%$sY!{R0iU+9nf6up{E~0n zpv<@NXSN_PT2)J2BT7;dOH!?pi&B9UgOP!eiLQYm5QP|;Ss8$kwt<0_fkD;e`EOA) zUBQq;QONb>dJVJUvJq(_%elF{r G5}E+JEHs7y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/white.png b/src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/white.png new file mode 100644 index 0000000000000000000000000000000000000000..2d787766f3e2e5f81fe9bcf449afb78dc8cec30c GIT binary patch literal 836 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3-pQ0$S$)DVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C%fh@Ck7R(nUo@2?+_> z+S;b3rtR(RAt53EA9()1!Jww5cIM2P+qZA;*|SGXOst@wpuWET|NsBN)7UD3+89fM z{DK)Ap4~_Tagw~$5AOV5lAy3ioqgLDtw5P;2i6|m_Ex+7&Xao#M;GRAD)c!2 zR5tcNFLNa0FQMDpbQ_G;Xm< zy!PyZZ(Kb(W@*dMwa8tp!8k>{X3o*`51HB`WB5uKf2ln_<;yp#`QF55244?IPMBue zev(m0AV4+T;44Gr)sm&RWj>YJJaNdk3~3MLt6*%o81A~{X5*si#><*sC_kLyJWC}` zy7y(;DaW)p#xMV#2ON7lF{<+RYKFMJ2S*Rz{#>%$+sc3TI$?$V$?}VzGwo1fj45Qe zX?3DuwH5=f!|MlkygRwBsI6p-x$G?Zt-*@N(bu;x(Es?E!>1-CdIo&j#%9`A-SbPn zaf347#-G`Oz-U!1ag8WRNi0dVN-jzTQVd20MkcxjhCmczXl7*qLfQrfRt5%Dljpxh z(U6;;l9^VCTLbqw^+2Eo4Y&;@nYpROC5gEO2t6hsON`8{3@ss+xbO(+0rfC=y85}S Ib4q9e03Y)@i2wiq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/yellow.png b/src/main/resources/assets/overdrive_that_matters/textures/block/android_charger/yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..8ef177804e19c7679a29bb2899da25755f151920 GIT binary patch literal 836 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 LNkvXXu0mjfpj{_{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/black.png b/src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/black.png new file mode 100644 index 0000000000000000000000000000000000000000..4809d12d978d12a4d3e5d0b856a9a24dd36a60d8 GIT binary patch literal 702 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!VDw>HYaZfQY`6?zK#qG8~eHcB(j1elRbib z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP{JU)^mS!_!N?*Y$7*xtX$Me` zsi%u$h{fr-6BUaN8wj{=SGmK+>DefLV*%eKpJnVB{TG;3W(Ib0Cryx9uq520FCaoo zgi(1S+mxqV`J zq_W=)cI#IgG=&Fjt&+GJ@+@Pv15n>-(d6Q*Ue?Y&8)Q=qf-gLrbTjg~t!(_6!hc*X zb-z~cy!-$APW>NjuN%1=r$3Nv1cs?RdP`(kYX@0Ff!CNG}JXR2r)3V zGB&a@Fw!HYaZfQY`6?zK#qG8~eHcB(j1elRbib z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP{JUfvz_aKdKgQB{DK)A zp4~_Tagw~Fdh=f{{f)j@9PO(+;2> zQ%@Ji5R21uCn^>lHV|;#u5yQs)3Z_h#sa=eKFioM`Y$l6%na=0PMRRIU`e<~UqFPG z2&3{uwkc1!_BrjEloQ%3QogJ|!{l?>)_PV>Ax;U2>Y4||erqh;&jh*fP1fC5b|_fi zCZAVY<6g(F<;5W;oN0X?>S2WOm* z?}wKCD^@&M|EvB`#C@?mH=eM$uYYe6-lW27r|sX-@nE0zd4XWG34J`?5@%|XG6Y1`EweSX2M)+!pX{6YaoK+wub zNoBtq?AEU~XbKP5S|xEc1O0}TiN(Ch5xu( z>VB=>dH4VKo%%o6UN>?#PJbZT2nK&H89jQ fFbOdHYaZfQY`6?zK#qG8~eHcB(j1elRbib z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP{JUJ|NsBLefxG+B-31=9>$U&zhDN3 zXE)M7oFs2|7ry+x2L3<}XMsm#F#`kNArNL1)$nQn3bL1Y`ns~eU}O=HW3@T+v;(Ne z)YHW=#NzbaiHb#s4Fp`btK4DZ^lTKrv4HQA&ocIm{tL`1GXp!hlP1V4SQ75h7Z9N( z!l*ovZOT)weNMY3<%IT%lrQVgF!@}zwVstzh*LtMy5>Q#-x>?|GeItVlXW+i9SYXB z$>){UxYzM(IrC;F?HLQ(9!=f&`_}6Vf}-Dc_wP=8ICq)UyARVJl+K7q{Oiro!5Qb{ z`=Mq3iWLvm|EfO}abGOYjVEmG>))G%H>vR2Y5R9{JlJP_ULaWePDXgdqC*|}KX!<( zTB*dxTha4l((^BTp$jzDDy-*7ayYP%&xCnJb5O8i+IICvpI>mRwTcETzfiyt5VUeq zQrYhYyY;ILn!*FNR!Lk9d6qHT0jTe^XmasYFKcI?4YDZ)!51D*x*7T0RyO`j;XkgH zx?ihz-u?f5r~VJN*Nxnb(;rAS0>f0b#5JNMC9x#cD!C{XNHG{07#Zps8tNJugcz7w z85>y{7-<_ASQ!{(t+IWKq9HdwB{QuOw+89&t${!d8gLs*GILXlOA>PnKzdAc4GeV+ fOhOFJtc-!in?fvUo_5_CsE5JR)z4*}Q$iB}0>1YZ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/cyan.png b/src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/cyan.png new file mode 100644 index 0000000000000000000000000000000000000000..b427647f06a2a623073ebaacb30203b4a4435799 GIT binary patch literal 702 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!VDw>HYaZfQY`6?zK#qG8~eHcB(j1elRbib z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP{JUgnPbVsU!zM8%@R1_G|zRqn8HdNzvRSipD5XBm4&{{?21nSq_$NfTriED87M3y9DX zVN{;THsvYTKBrxiazcAW%9r(Ln0zkVTF=TU#3>n^bu1wEa6e9_+I|FA%JKCnG#!(V-6gA3MZX ztyJRUt?2nN>G>DF&;=T671nbkIUHEXXTrRqIVe~$ZM*uT&o8*uT15kvUnt-R2wFKQ zsqA-y-TKuAP2mAst0b<5JjqhRz=?^3ufnlmz;u=wsl30>zm0Xkxq!^40j0|-R4RwtSLJUl; zjE$@ejI<35tPBjYR@uHq(U6;;l9^VCTZ8oX)J4Y&;@nYpROC5gEOAU!6!28Ox@ fCLxAqR>nZ%O(B*vPrL36)WhKE>gTe~DWM4fSjzUq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/gray.png b/src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/gray.png new file mode 100644 index 0000000000000000000000000000000000000000..e400ab1edf73537720185be166209ea5285a075e GIT binary patch literal 702 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!VDw>HYaZfQY`6?zK#qG8~eHcB(j1elRbib z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP{JU)^mS!_!N?*Y$7*xtX$Me` zsi%u$h{fr-6BUaN8wj{=SGmK+>DefLV*%eKpJnVB{TG;3W(Ib0Cryx9uq520FCaoo zgi(1S+mxqV`J zq_W=)cI#IgG=&Fjt&+GJ@+@Pv15n>-(d6Q*Ue?Y&8)Q=qf-gLrbTjg~t!(_6!hc*X zb-z~cy!-$APW>NjuN%1=r$3Nv1cs?RdP`(kYX@0Ff!CNG}JXR2r)3V zGB&a@Fw!fi literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/green.png b/src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/green.png new file mode 100644 index 0000000000000000000000000000000000000000..5fae921aa3735541edf9428f50aa8d8d2588949a GIT binary patch literal 702 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!VDw>HYaZfQY`6?zK#qG8~eHcB(j1elRbib z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP{JUS(r(e>|NsBLef#$OZL%FeJ&Ywme!&b5 z&u*lFI7!~_E`0fW4g7%|&H|6fVg?4jLm)^mS!_!N?*Y$7*xtDbNH) zQ%@Ji5R21uCn^>lHV|;#u5yQs)3Z_h#sa=eKFioM`Y$l6%na=0PMRRIU`e<~UqFPG z2&3{uwkc1!_BrjEloQ%3QogJ|!{l?>)_PV>Ax;U2>Y4||erqh;&jh*fP1fC5b|_fi zCZAVY<6g(F<;5W;oN0X?>S2WOm* z?}wKCD^@&M|EvB`#C@?mH=eM$uYYe6-lW27r|sX-@nE0zd4XWG34J`?5@%|XG6Y1`EweSX2M)+!pX{6YaoK+wub zNoBtq?AEU~XbKP5S|xEc1O0}TiN(Ch5xu( z>VB=>dH4VKo%%o6UN>?#PJbZT2nK&H89jQ fFbOdHYaZfQY`6?zK#qG8~eHcB(j1elRbib z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP{JUR~Ji@(X5g zcy=QV#7XjYcj3$5Yv2#$a29w(7BevL9RguSQ4OyKpdfpRr>`sf3q}?JIaZr9Pdk8m zOg&v3Lo80uov2uJ*g(K_yUHClPR~a18w>a@`7C44=)b_MGBdD~J86QnBXKNIA_H(7UM*`Z*4 zn|xkrje8xxmNRc=(w?!f?a|bYzi++1ASn86cmM9hhjW)nz56izLFtT$#J}DQ9h`AK zz8_lluUPS5{jd5%5%eF`AnEsGzSGMrfpY$^!Ww1TB~Tl@(TqV0YNJ# zC6)bduv@>{pea0HYn8;+kY^dQ9f0~yizXLe^|E&M*&v%@5Pad`q??h?ZDr%n6#nCC zsr$8h=iUF`ck2IOd)>(0IQ@ZSBQQ)=OI#yLQW8s2t&)pUffR$0fsvuEp`oskL5P8= zm9dePfswX>ft7(l)+*b#C>nC}Q!>*kachwN-WmwhpaHj`Br`X)xFj*R0Hnu6*T7KM gz$C=b%*q&OyeY(z=4scRfqED`UHx3vIVCg!0FA==DF6Tf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/light_gray.png b/src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer/light_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..39b2653da096b97e5212f130da8608b6d665f8e8 GIT binary patch literal 702 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer_mask.png b/src/main/resources/assets/overdrive_that_matters/textures/block/drive_viewer_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..306715ad1c48311aba8ef21a117e3f5af9270de4 GIT binary patch literal 1234 zcmV;@1TFiCP)EX>4Tx04R}tkvmAkP!xv$rb>%c94sQ@kfA!+#TSmHibb$c+6t{YnB4RQO&XFE z7e~Rh;NWAi>fqw6tAnc`2tGiZ9h?+hq{MTRLW>v=T<*tz&;N7pxq#5DGS%#f0jg#h z=|o)2z=x)?xH-)yYJ8HR|+Nrd?Im->4rtTK|H%@ z>74h8!>lYR#OK5l23?T&k?XR{Z=6dG3p_JyWYhD+VPdh=#c~(3vY`@B6Gs$PqkJLf zvch?bvs$gQ_C5IvLj`Rm!*yDtNMH#`q#!~@9TikzAxgVOiitFx$36Tbjz2{%nOqex zax9<*6_Voz|AXJNHH%Y|Zc-=?^uE~k#~2XU1zHW;{yw(t)(PN$2ClS@zt#liK1pwM zw8#-Kunk;XcQknqxZDATpLEHP9LY~hC>DYDGy0}HFn9~}t+{h+pX2la$kMEqZ-9eC zV7x@x>mKh8cF*nKp7#8H0G6F{wGk}A8UO$Q24YJ`L;(K){{a7>y{D4^000SaNLh0L z01m7xD_4-n{R;wjiNftPcBc(T)OfZ|xaJgJk z>DTLZ=(_&b0tj&=)M~ZdzMiPr%j(2I$=f`~<1sp&4pyrb0N{4JVY}S|05nbe`t?yh zwNas-@wSad;02$p<-Ush?yC{`P_g~SVe9GGs+U@qk zcrX}9ttS(jIpK_?cjsG*wmabM$N&hV(v`W%Eb}l30-igc`X_*L8TF$3%V6 zd_HHn6Ogur{wm?3IWqllCwnv+WooM{RE}m%B(kQYq@Omjgri0f`~6;c9gRXng-J}8R?5|O#5h>=9B(ciy@g}BB*PcCX37GTdh_kNxH5_T0mUZn0rS^ zHXD=CuT&~53<7<05pwNYEdrq?EnA(07*qoM6N<$fy diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/item_monitor/blue.png b/src/main/resources/assets/overdrive_that_matters/textures/block/item_monitor/blue.png index c0046cb5001d03b885677b84532e0439a9eef163..edddb6a75910bdf68e6bf53cb9346aa001f0acd5 100644 GIT binary patch delta 72 zcmX@Ya)f0+9?P-(V0E6RRsqoH4Q8nq5Gg@m2Dy8yio?GRhg6Ss58y b85n9C7+4t?#3oFi%m4(Qu6{1-oD!M<`7#+7 delta 72 zcmX@Ya)f0Wow+ITXSQO>~B$_R)o ZwG9lc3=9|xmCG1_z|+;wWt~$(697%O6-odA diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/item_monitor/brown.png b/src/main/resources/assets/overdrive_that_matters/textures/block/item_monitor/brown.png index a88e41fa3a6f94cf83795c0e65bef058e1473181..b6ff96d344b24f67f7ded4a7728759c55ccee9bc 100644 GIT binary patch delta 72 zcmX@Ya)f0S_4W1tZ!n07iCuPU(4N?C%`PC$_$qnUjg2Q`8RZPktc;AU b3=Fjm46F@*nC delta 72 zcmX@Ya)f0q2__4W1tZ!n07iAAjWR5r2Qnq5Gg@m2Dy8yio?GRhg6Ss58y b85n9C7+4t?#3oFi%m4(Qu6{1-oD!M<1g05b delta 72 zcmX@Ya)f0iHPY delta 72 zcmX@Ya)f0&E6v>CYD;Dtvj*Znw?crwu+~#Y2(RQMmYmhDzmvv4FO#qca7D@mB diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/item_monitor/light_gray.png b/src/main/resources/assets/overdrive_that_matters/textures/block/item_monitor/light_gray.png index d9f07c0bcb78d353ba2f70a22d41f84c244364ec..3113ab93e8a41f4c3a288f0a9124d3cc2a747e68 100644 GIT binary patch delta 72 zcmX@Ya)f0g((O-(V0E6Z^J#tM9~iYjy!~##hO+Zfram%P41PW@Th- cWnidnU|?ln5SuW4G6N8Jy85}Sb4q9e04^LF6#xJL delta 72 zcmX@Ya)f085l4YDwi<;fv2mV%Q~loCIEas77+jd diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/item_monitor/magenta.png b/src/main/resources/assets/overdrive_that_matters/textures/block/item_monitor/magenta.png index 921bc193807784d7d686472bcd8c0a9bf7375d7a..51e4abe7206657f71b9e6cfe15d0ee19c6d27fa5 100644 GIT binary patch delta 72 zcmX@Ya)f0H8R* delta 72 zcmX@Ya)f0+9?P-(V0E6H72<)1BCE%`PC$_$qnUjg2Q`8RZPktc;AU b3=Fjm46F@hk6>0zg diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/item_monitor/pink.png b/src/main/resources/assets/overdrive_that_matters/textures/block/item_monitor/pink.png index 23da7f9ffabf31f28e340b7493495ca10dc68915..dab0e2083cd71cecf784014b960b2ba41c95ac7e 100644 GIT binary patch delta 72 zcmX@Ya)f0+9?P-(V0E6Epc*et2TLHM@W~Wow+ITXSQO>~B$_R)o ZwG9lc3=9|xmCG1_z|+;wWt~$(698H%6=nbc diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/item_monitor/red.png b/src/main/resources/assets/overdrive_that_matters/textures/block/item_monitor/red.png index 2b2972bd63c03f9cf2c389aa8c9df10a12c45a5e..e2121aaafd054b3a4c9c5d07e2d850c26b05135a 100644 GIT binary patch delta 72 zcmX@Ya)f0g((O-(V0E6WcSN^U}n2Yjy!~##hO+Zfram%P41PW@Th- cWnidnU|?ln5SuW4G6N8Jy85}Sb4q9e00GSzMgRZ+ delta 72 zcmX@Ya)f0>kU6sG_H diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/item_monitor/white.png b/src/main/resources/assets/overdrive_that_matters/textures/block/item_monitor/white.png index 5c18d98053d63e0e8861781b15afbea7f3ad6cd1..bbed3c6c70ea7cb5f6139d38c8339a77b78c5457 100644 GIT binary patch delta 349 zcmV-j0iyoj1jGc87zqRe0001iRASC3XM+00DGTPE!Ct=GbNc0004EOGiWmk7(IZk$EA15ElXJW183i z007NNL_t(2&y~?T4#OY}24Id*$Pi_WTNN=Txk1${L}KpHJuI96i8XB8w%8Ox)T#dx z@yRxiFb))6zN}j))9p!lusmf^&uT zUi${hIn)5K2ZVgm257foWflMt188W|lDBP!W~fj21LblR>L2^& v1EQ^Si^Y!e29v!3gdQ1m6UZ7zqdf000115hW;*AwL-cbW%=J004HA%{Tx600Lr5M??VshmXv^ zk)a`f1sNTB42psP009t5L_t(I%axM7ZNo4Sg}(>~w$26|;A*GQ2Am=z1RlgQXbNrM zCaO6AH?Uh(DUOmzN|2F<1E{-u_pgs{A{!JMUHI$^1JC$ds(eZ8Z-su3yeb01g&A-& zfVqvOG4w7Ckfwqt&{GGyq-o ze-O9e{7B5j4L)jWJP%O1;{cEO%P|TVo zDux_Hr9GiERYyIz#qjS%X{_q&w98OkM|T{8DAyOy0P(OETf#EnU#^T cm4TtQfq|8QL2SbG$qYc?>FVdQ&MBb@0A8XR@Bjb+ delta 72 zcmX@Ya)f0Z^(E*6gg3vQ<1?O&d?fGRhg4S{VV6 arM7{Am4N|cp>i1m5O})!xvX(0005DNkl&XCZ+jf+bZUZVLVyfNx@;k`_ISu9ACS>shi>}i!#Dupz00000NkvXXu0mjfrLoZy delta 459 zcmV;+0W|))2fPQcy8#IR00000`9r&Zlf(fbe*_^Xs$GTr0005FNklhNJh^GK|04WKVoY8)4W1Bs=7x_2#o48b1pw>y8dX&x71!$(B7*bzj2vvYTPP7hRaMySc8?U{rfCYR_3d_h ze;^Nq0)W+O1pv6;?}OdtayePE>sIDnDA(nEGIst~P_GX3iMU7+5l*L5aX1{392dybc)G>amj`IKj002ovPDHLkV1g7( B);0hD diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/black.png b/src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/black.png new file mode 100644 index 0000000000000000000000000000000000000000..1862c9e8f3c245f6e6b7d0f5f1c0a35969c17ab6 GIT binary patch literal 635 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgp%vg0;tHfgLP8P}6126o zO-)S;3JU%M!2?ezDLEM#h5GvX|2G)g+uOy&#ID&ePX?-HED7=pW^j0RBMrn!@^*J& zOHA8Q3*>MXctjR6Fz_7!VaBX$ot!{H_7YEDSN0c-ECS+eCG7mwK%pO=E{-7@=W8cy z%sXTt(Ds)rVvTG~=5f6_D+5@WzbYzD;r+uh^%s|<(Kcoqr)MQ^<{eBnDrHW)*V?Tt zbJ^psdHt{d_si8)CS7asTBLSq1xv%$Z=4UF9)2C`W4!+Dt`EP2*6& zHZGp`mcM<`jrytwpH@w~v8^cclwg_3qh(X#?*!g&v}XVRsAzgE`-WFCyBU^U(`LGI zDvxdV zZv{K2r0?W=j^}H{i@TKg(-$4x*nfecWFiNT*Y5oP(r@0sXnrap-@NGS`o#3C4S)9L zgaN}qwZt`|BqgyV)hf9t6-Y4{85kMq8XD;u7=;*ES{WHynHXpr7+4t?Fq}*DM$wR) zpOTqYiCaVANSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgp%vg0;tHfgLP8P}6126o zO-)S;3JU%M!2?en-Bx|W{`&g*|2G)g+uOy ~;xd~LwSQ6wH%;50sMjD8d?NMQuIw)uSp>w{O4#|UfkHn#T^vI+&eu-Z zn0LrPpzSYL#2VR}%;S1Mt%yqixJKPR~l-%sZHDRLY!oueDoQ z=Ca3M^ZH-^@0Y8qOuE+MwMgyK3YLbg-#8yUJ^VV>$9VnQT_1i4t>3wN&gxS)d6!g% zZCpI>Er0u>8}(HWKCPN|V_Q+?DZw(6N6V(f-wC|mXwClrQPK2T_6@IOb~7xyrp3=!EIB&! z-U@b3N#Du$9M9K?7k4S~r!P9XvHt=?$wUqwuig3orQf`N(fm|IzIoBt^@-_O8~*Ig z2?K_KYKdz^NlIc#s#S7PDv)9@GB7gIH8j#SFbXlSv@$ZZGBMCLFt9Q(U^tiPjiMnp zKP5A*61RrJ$v3|PHE6(XD9OxCEiOsSEdc2;(KRsCH82S=G_x`?wlXk-STf`IN?D*D N22WQ%mvv4FO#pNJ;H&@u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/brown.png b/src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/brown.png new file mode 100644 index 0000000000000000000000000000000000000000..2ba0602cc0981ae132ccf3ba4b90d247170334b1 GIT binary patch literal 635 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgp%vg0;tHfgLP8P}6126o zO-)S;3JU%M!2{1ETcu1#)%yDS|2G)g+uOy nas?gy%7ED7=pW^j0RBMrn!@^*J& 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 z69xam9juR N44$rjF6*2UngGx1;7kAj literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/orange.png b/src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/orange.png new file mode 100644 index 0000000000000000000000000000000000000000..a880c1989b3a71e476623bf70c00f25bb32e1af1 GIT binary patch literal 635 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgp%vg0;tHfgLP8P}6126o zO-)S;3JU%M!2{3BDZG!e`ReQI|KDI}Z*Lb96WeSOy9KD4u_VYZn8D%MjWiG^$=lt9 zEir9JEs(=m;1OBOz`%C^gc-B0b#ej)*-JcqUD;nSvIvN?m9X>FOm>}FVYO`GY; zsXXQxIkV>bGJ7%@=+{42bzrbb)D~@UYL*IQGx)Z23y(v;gQvtyxt_C67flzeSaNjc zy%p@7lD?DgIi9Z(FYZ#}PhWI&WB&z)l8GEVUc2-EOTT&lqWP(aeDk8O>l4$nHvHL} z69xam9juR N44$rjF6*2UngITK;OqbZ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/pink.png b/src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/pink.png new file mode 100644 index 0000000000000000000000000000000000000000..876bf206b97028323090a3722f3a1a13e03dcf9c GIT binary patch literal 635 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgp%vg0;tHfgLP8P}6126o zO-)S;3JU%M!2{2W<&z#X%&o7l|9^v_y}eybOssv4s}@i-V@Z%-FoVOh8)+a;lDE4H zTVmRdS|EqBz$3Dlfr0M;2s36~>*NFqvX^-Jy0X7uWDyW&D`Dra1`7S~ba4#PIA1$q zW8NVHfwsR~5o=^?GLP%cSsB2}{8dqL3hy75slT`+jkYn{I6W(QGw)!sQ7LoUz1D7J znadu3&Fg>tzhADdGU-~2*CMq`D_9z~e&c-b^ziFgALI3JcYXLJw0`I6Ijc|IcC)=s4d#y)GQUqX7Fw479NLw2TzHaay@6CE}AY_vE=B? zdn?#EC4DE~b39)oUfiX`pT6km#{LToB@;P#ymsgRmwxm9Me|b;`Q}Am*C(cDZTPb{ zCkz+{swJ)wB`Jv|saDBFsX&Us$iT=**U(7Uz$nDP(#put%EUn1z`)ADfZ<%CH;RVb z{FKbJO57R>C*S-I)Sv;kp(HamwYVfPw*aKaMAyJj*T5vi(9Fun*vh~RV#$o-D`kOt O7(8A5T-G@yGywp_0O8I6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/purple.png b/src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/purple.png new file mode 100644 index 0000000000000000000000000000000000000000..f7be420f2e724b194d26253f5165c1f462676cf1 GIT binary patch literal 635 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgp%vg0;tHfgLP8P}6126o zO-)S;3JU%M!2{0}g^Ah9bL#8s|KDI}Z*Lb96Ki7AF9oV*ED7=pW^j0RBMrn!@^*J& zOHA8Q3*>MXctjR6Fz_7!VaBX$ot!{H_7YEDSN0c-ECS+eCG7mwK%pO=E{-7@=W8cy z%sXTt(Ds)rVvTG~=5f6_D+5@WzbYzD;r+uh^%s|<(Kcoqr)MQ^<{eBnDrHW)*V?Tt zbJ^psdHt{d_si8)CS7asTBLSq1xv%$Z=4UF9)2C`W4!+Dt`EP2*6& zHZGp`mcM<`jrytwpH@w~v8^cclwg_3qh(X#?*!g&v}XVRsAzgE`-WFCyBU^U(`LGI zDvxdV zZv{K2r0?W=j^}H{i@TKg(-$4x*nfecWFiNT*Y5oP(r@0sXnrap-@NGS`o#3C4S)9L zgaN}qwZt`|BqgyV)hf9t6-Y4{85kMq8XD;u7=;*ES{WHynHXpr7+4t?Fq}*DM$wR) zpOTqYiCaVA literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/red.png b/src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/red.png new file mode 100644 index 0000000000000000000000000000000000000000..7cef740f6cef3da3853f53a3e014d1c367c07a9d GIT binary patch literal 635 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgp%vg0;tHfgLP8P}6126o zO-)S;3JU%M!2{1WdD#g{^7Zxg|8Fp~x3`OliQS2P!4Fi;SQ6wH%;50sMjD8d?NMQuIw)uSp>w{O4#|UfkHn#T^vI+&eu-Z zn0LrPpzSYL#2VR}%;S1Mt%yqixJKPR~l-%sZHDRLY!oueDoQ z=Ca3M^ZH-^@0Y8qOuE+MwMgyK3YLbg-#8yUJ^VV>$9VnQT_1i4t>3wN&gxS)d6!g% zZCpI>Er0u>8}(HWKCPN|V_Q+?DZw(6N6V(f-wC|mXwClrQPK2T_6@IOb~7xyrp3=!EIB&! z-U@b3N#Du$9M9K?7k4S~r!P9XvHt=?$wUqwuig3orQf`N(fm|IzIoBt^@-_O8~*Ig z2?K_KYKdz^NlIc#s#S7PDv)9@GB7gIH8j#SFbXlSv@$ZZGBMCLFt9Q(U^tiPjiMnp zKP5A*61RrJ$v3|PHE6(XD9OxCEiOsSEdc2;(KRsCH82S=G_x`?wlXk-STf`IN?D*D N22WQ%mvv4FO#oKC;1~b^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/white.png b/src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel/white.png new file mode 100644 index 0000000000000000000000000000000000000000..d73ecd511334442544b44c8f367bac9e4c2f4028 GIT binary patch literal 635 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgp%vg0;tHfgLP8P}6126o zO-)S;3JU%M!2{1bckaA-^QOMO{{Ibz_V#u$F|qp(ODln@8B2ovf*Bm1-ADs*lDyqr z*b>ur)B-u21s;*b3=Dh+K$tP>S|=w^kiEpy*OmPRBa47ITM0XVHBjh>r;B5V#`)R_ z8}kks2(idZ9ClX+Zk&dLB*=C6v1Q+WTdO#Q_rX|#>m#_3tfn|TM5jY^r*?zMI+ z%Ut&OYhM5B|NU}xl}XoHycVflTEWt=^&97dr-xt1`WUZ&yX(U*q4hgg&slxyChwBU zu#Jo7z2$FTbfdoN!KYQzZfq;cJSA9W@@UzV_&b638?D*@KPsAD%f8{2%x;Ed*R+|g zoXTUKkuz()FS93ufqwmSRR;!}L~YRqr)H@@HiK_Vx9~XhJ9tXWlNSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgp%vg0;tHfgLP8P}6126o zO-)S;3JU%M!2{2mtL0zrP^_=7|9^v_y}eybOssgW`c$B5#*!evUY zw#2j@wLlJMfk$L90|Vay5N6D}*2xJJWH0gbb!C6S$RZ%lR>IC-4HWv}>EaloalUrK z#=JuY0&Rb}BG$;(WFFU>voe5{`KzMh6y859Q-5(u8f{~?ae7wrX5PVMqf+Lyd#&Bd zGM7F6n%DpOf4^K^Wzw}4uSIH?REYM0KE~_c?)vacX#LLBb5@_a$-AU7 zY~$j2Z~5C7-Kej6@M+bw8{3L9PYITpJX$s-{!ZZiMr-!}kBX+(vTt}LvzuYrHEpIV zr}CI*UO_QmvAUQh^kMk%5tsuAz~xfl-KorInGPm5G72fq|8Q0mHdOZxju= z`6-!cmAEw&PQLjas6hj6LrG?CYH>+oZUIP-iLQa6u7OF2p_!GDv6X=t#F81uSIPqQ OFnGH9xvXD|o literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel_mask.png b/src/main/resources/assets/overdrive_that_matters/textures/block/matter_panel_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..476fde21a9619d8b29112faf195ea92edef63ed5 GIT binary patch literal 1053 zcmV+&1mgRNP)EX>4Tx04R}tkvmAkP!xv$rb>%c94sQ@kfA!+#TSmHibb$c+6t{YnB4RQO&XFE z7e~Rh;NWAi>fqw6tAnc`2tGiZ9h?+hq{MTRLW>v=T<*tz&;N7pxq#5DGS%#f0jg#h z=|o)2z=x)?xH-)yYJ8HR|+Nrd?Im->4rtTK|H%@ z>74h8!>lYR#OK5l23?T&k?XR{Z=6dG3p_JyWYhD+VPdh=#c~(3vY`@B6Gs$PqkJLf zvch?bvs$gQ_C5IvLj`Rm!*yDtNMH#`q#!~@9TikzAxgVOiitFx$36Tbjz2{%nOqex zax9<*6_Voz|AXJNHH%Y|Zc-=?^uE~k#~2XU1zHW;{yw(t)(PN$2ClS@zt#liK1pwM zw8#-Kunk;XcQknqxZDATpLEHP9LY~hC>DYDGy0}HFn9~}t+{h+pX2la$kMEqZ-9eC zV7x@x>mKh8cF*nKp7#8H0G6F{wGk}A8UO$Q24YJ`L;(K){{a7>y{D4^000SaNLh0L z01m(a01m(bYSxJf00007bV*G`2j~F=5Ed5)tRBb!00J3FL_t(o!^KxIj;k;beXOVv zn!-(JX;bq|AyFj-G9qWA$Al0VyShVVF%^!m%bmM0h@*vx!SM)?=vl zv1uCo4~(bad_I3f*zI;+MHs3&4*iU5Dbj zATZnUr%>&5X(1X{fH5}q^>=66HYS7sW6WIxLI~7#Jqhwj5_MgJbMBr%RaGFO(V0Fg z{l;UC)pd=ks{9>8ZQF@qnx^9__?Y=iFVJU6L`c)r8eF&a(F;P`#nDW{b}9AN z4Rz;j+fJMk(Mxc1YrJ$rU0h}ow&2RvOFQ=A#H$ER!P$iAqX1cNL}qX)<%=ft)8YL} zW)qxEnEzCSHnp2c=(b+#0O$PUQtS&sQ50hdo(s;ob2|>Z7llly7@=s<23vL X7p^XBr|>$500000NkvXXu0mjfp26Pl literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/black.png b/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/black.png new file mode 100644 index 0000000000000000000000000000000000000000..535c742370cb89db5ab9ab890ec42e8461f63398 GIT binary patch literal 672 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIOqUQN|>1cNd<<&4I~44rhT! zWHAE+-(e7DJf6QI1t`c~;_2(k{(_N3K;CNd#-Cq+dUQQq978NlADv{I$7CqbdRDNA zHGEo-n)?Y+pJ@TYzfA7k3Tk0B?JBDlDGO3w`{;CP+Mnj~x$}+urS{ZRz30_d7IQlF z+j{NxV+)svbW5}FN7*Y~nB`Cs<5-g8yIOLG#^*&PpSuott<2!qaM)^jM$}B1Fik0@ zgA*C_IQx`@WHxT$-F>DscS;1~>yGCW8+q6|m!~8!KX}A>LRNE<<^4@sK~uxBz5fdTVA|~crtxdy+ZDjDR4s9h zC`m~yNwrEYN(E93Mg~Skx(24YhNd9~W>%)gR)&_^1_o9J22FfBeNZ&y=BH$)RpQq0 zIhgSSP=f~ChLX(O)Z&uF+yamu6I}yCT?3O4Lo+L5Ln~7Yh$XJcmu~{~FnGH9xvX1cNd<<&4I~44rhT! zWHAE+-(e7DJf6QI1t`c~;_2(k{(_N3K;CNd#-Cq+dUQQq978NlADv{I$7CqbdRDNA zHGEo-n)?Y+pJ@TYzfA7k3Tk0B?JBDlDGO3w`{;CP+Mnj~x$}+urS{ZRz30_d7IQlF z+j{NxV+)svbW5}FN7*Y~nB`Cs<5-g8yIOLG#^*&PpSuott<2!qaM)^jM$}B1Fik0@ zgA*C_IQx`@WHxT$-F>DscS;1~>yGCW8+q6|m!~8!KX}A>LRNE<<^4@sK~uxBz5fdTVA|~crtxdy+ZDjDR4s9h zC`m~yNwrEYN(E93Mg~Skx(24YhNd9~W>%)gR)&_^1_o9J22FfBeNZ&y=BH$)RpQq0 zIhgSSP=f~ChLX(O)Z&uF+yamu6I}yCT?3O4Lo+L5Ln~7Yh$XJcmu~{~FnGH9xvXFj_2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/brown.png b/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/brown.png new file mode 100644 index 0000000000000000000000000000000000000000..bacf95324f40ca9595073629b4d3afb6256f33c3 GIT binary patch literal 672 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fI?mknRJ0*hgb;t9GjXZ3f%Tp4VA3WkbA*(sbaqH5qkOf^KOG8tB z?y3B=MtGjOvRTzmsj7yB{Og?^#FHi{Eo5e7Vc2=4zOG`HJj1#B2~l0fv8T^x@0XLl z{)S`8{2M9^f$1zVjq48Q=l!1-C;#iA^aGhQ2hT7TAFqsOxW~lWacV(#)$IFs*6q;v zwfP3mi{=9lAL-jM?uoCq{$ogGb>YLD?>|d0|P4qgC@S6J}4S;^HVa@DsgN0 z9L)Fus6hj6LrG?CYH>+oZUIP-iLQa6u7OF2p_!Gjp_Qox#1hx!%Qt~~7(8A5T-G@y GGywo2AME7- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/cyan.png b/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/cyan.png new file mode 100644 index 0000000000000000000000000000000000000000..1c2078f641dc0428ead272eb77b70ccd63307407 GIT binary patch literal 672 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fI?mknRJ0*hgb;t9GjXZ3f%Tp4VA3WkbA*(sbaqH5qkOf^KOG8tB z?y3B=MtGjOvRTzmsj7yB{Og?^#FHi{Eo5e7Vc2=4zOG`HJj1#B2~l0fv8T^x@0XLl z{)S`8{2M9^f$1zVjq48Q=l!1-C;#iA^aGhQ2hT7TAFqsOxW~lWacV(#)$IFs*6q;v zwfP3mi{=9lAL-jM?uoCq{$ogGb>YLD?>|d0|P4qgC@S6J}4S;^HVa@DsgN0 z9L)Fus6hj6LrG?CYH>+oZUIP-iLQa6u7OF2p_!Gjp_Qox#1hx!%Qt~~7(8A5T-G@y GGywqK>+He+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/gray.png b/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/gray.png new file mode 100644 index 0000000000000000000000000000000000000000..d0a0f6b5ea9b92c1daf02eaaea24cad87d1bdaf7 GIT binary patch literal 672 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fI21szhGn$khhw=@#hzy9$ilt#}JFtMf?8NjyUMCX%7T>FK02M6_NTdg?tCMEsXaAS?|HSA#hgz4 zwqCpa*uo_u-O?=lQT9p~W;v9^IF{u2u9n=P@p)0n=dJ@@D>FDY9JX4X5j9gLOjC;K z;6w&J&ORj}nT=a`cb_TEof5(Ly5sr8Mjp1#zxOHh)$bznrrJ*T5 z_f&pbBRo%C*{o`(R8_-5{`Jld;z<*f7BVxkFzmciUso|pp5fg6gs3j#*wg2;_sdCN zf5Wk4{tXp|z;qUw#&w7D^Zw6^lmGQl`hm=ugJ&3vk5|Ss++$+xIJKa=YWDp*>vm}T z+I)lOMe~7&kM!*r_rzCQ|1xBLWih2ed4H2u(A2PO@4v!7m^ORAY5bb_b_FmjRZCnW zN>UO_QmvAUQh^kMk%5tsu7Rnpp=pSLnU$%rm7%4!fq|8QK@;Cj9~2F_`6-!cmAEy0 z4rcrS)Sv;kp(HamwYVfPw*aKaMAyJj*T5vi(9Fu%(8|;TVu@?=<(oh~44$rjF6*2U FngD$<>>L09 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/green.png b/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/green.png new file mode 100644 index 0000000000000000000000000000000000000000..5e684acc3e021a2c3c817b9018f8523adf7a17e7 GIT binary patch literal 672 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fI?mknRJ0*hgb;t9GjXZ3f%Tp4VA3WkbA*(sbaqH5qkOf^KOG8tB z?y3B=MtGjOvRTzmsj7yB{Og?^#FHi{Eo5e7Vc2=4zOG`HJj1#B2~l0fv8T^x@0XLl z{)S`8{2M9^f$1zVjq48Q=l!1-C;#iA^aGhQ2hT7TAFqsOxW~lWacV(#)$IFs*6q;v zwfP3mi{=9lAL-jM?uoCq{$ogGb>YLD?>|d0|P4qgC@S6J}4S;^HVa@DsgN0 z9L)Fus6hj6LrG?CYH>+oZUIP-iLQa6u7OF2p_!Gjp_Qox#1hx!%Qt~~7(8A5T-G@y GGywo~^6ZiT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/light_blue.png b/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/light_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..2e65ce25e48bf5a8467464ee052efd6cb7a3b7b4 GIT binary patch literal 672 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIv zL>4nJ@ErzW#^d=bQh@OHu1mvwIZ~XZMs7Ke+#WBR<^wCMSc}#`^t!D*` zSi`3UskxsJ^_dnR{LAFtt)LcG)2^~=k+LA=wU17xru}IypF7{kUusWH)q7rTWih8y zzpdA9Kelj*NVhZ#f0Vt_g;@?IF^(lUzN;m7XnbB&^117P*UAiz4Tr6kXGG1E3DcBf zIyjL*kF!rnNM_>}-rZ+PbEiZwzV3KFv5|+Zb9qVv^Mgm6CuB7zIc{Cr6|$f!WNB#1 z&pnl&)(Fp2S2nBKDOJ_5kbk|igLu*erG?ClEDSrZ)Ynzal4m$~KOw5iIQI1U?EP}m z*WYj~nSVotAuydqrg7cj{Jj73;^collzt#{=HMB|;^UR^4ELB=J5DX=u9|)S&bl2M zzc%0CdC`2};Uj%J#y#=X*1rsyUs+6PP~P996*M(0+xxHZ52nrDZyLWQzFh$fOVtwB zh?11Vl2ohYqEsNoU}Ruqq-$WRYiJr`U}j}%Y-MPvZD3$!V9><3(+5REZhlH;S|x4` zpMx1c05xd9Z79jiO)V}-%q;-vG0`HncLefLP+1eEB9&4}+(xpUXO@ GgeCy<#_qEK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/light_gray.png b/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/light_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..f1b3ea6f9221b63f28ea9d6b5550ffc81c5e0bbd GIT binary patch literal 672 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIMdwQDx|NkG9u00(n%9!Ns?!wc!IWQT>;Vkfo zEM{QfI}E~%$MaXD00r4gJbhi+Uof%=$XiX``11=;kFKYSV~EA+qmyj&m<$D4&k7c? zhEEGpb3Y;KGc7>)m&v_bK`pGNU1ilGWkJeoADvE3`_o)LcfOIo)SjBE_q^K5Vos-i zTd&=IY~d1-ZfO?&D0`&~vm8od97}S1S4-~D_`Im(bJqc{l^Glx4qGkHh?*%ArYXgA za3X^qXP=Ug%*HLeyUPKjWA-SK>4BM)2W@{|PT2ah;U$ZAe<+`6N73Oq;#mG=5Edy8;-NswJ)w zB`Jv|saDBFsX&Us$iT=**T7WQ&@{xr%*xc*%Ft5Vz`)ADpowp%4~mA|{FKbJO57Sg z2Qz*EYS4h&P?DLOT3nKtTL98yqHAENYhV&$Xl7+>Xk}^vvBWj`@=c%~22WQ%mvv4F FO#pz^?S=pV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/lime.png b/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/lime.png new file mode 100644 index 0000000000000000000000000000000000000000..20c5281a29138b9b2d84d83e06835251aaac14a9 GIT binary patch literal 672 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIiQl&YMH!R4-CcMZHwPvIIh+L^ zk;M!Qe1}1p@p%4<6rdn`iKnkC`wK=E0eP#*8-IQQ>e2OdaSX9IeRPs-9+RO!>si4f z*6?XTYVIdQeWnEn|1!CEE2xFlw5zOIq%25z?W5DFX@8o_=gv3sm)cWP^`2K-Sw#1r1q@Xr60(gIe3P#_;_VJ!#yU}j#CS|t7hN7vu=mR zugy1jUNj$g_(2OC7#SED=^B{o8k&X}m|2+`TNzqv8yHv_7&P(i^g+>(o1c=IR*74~ z=U~PUKn)sj8%i>BQ;SOya|=LvOmqzlbq!2H49%>J4XsQqAeOi$U%m;{!{F)a=d#Wz Gp$PzEGVS*O literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/magenta.png b/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/magenta.png new file mode 100644 index 0000000000000000000000000000000000000000..893bc49078c3026964852aa7d7cd0432e571aa50 GIT binary patch literal 672 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIe2OdaSX9IeRPs-9+RO!>si4f z*6?XTYVIdQeWnEn|1!CEE2xFlw5zOIq%25z?W5DFX@8o_=gv3sm)cWP^`2K-Sw#1r1q@Xr60(gIe3P#_;_VJ!#yU}j#CS|t7hN7vu=mR zugy1jUNj$g_(2OC7#SED=^B{o8k&X}m|2+`TNzqv8yHv_7&P(i^g+>(o1c=IR*74~ z=U~PUKn)sj8%i>BQ;SOya|=LvOmqzlbq!2H49%>J4XsQqAeOi$U%m;{!{F)a=d#Wz Gp$PzMrS10s literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/orange.png b/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/orange.png new file mode 100644 index 0000000000000000000000000000000000000000..99f66b2b95d6da4a99b009ba28fc2e236c4fa1f2 GIT binary patch literal 672 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIe2OdaSX9IeRPs-9+RO!>si4f z*6?XTYVIdQeWnEn|1!CEE2xFlw5zOIq%25z?W5DFX@8o_=gv3sm)cWP^`2K-Sw#1r1q@Xr60(gIe3P#_;_VJ!#yU}j#CS|t7hN7vu=mR zugy1jUNj$g_(2OC7#SED=^B{o8k&X}m|2+`TNzqv8yHv_7&P(i^g+>(o1c=IR*74~ z=U~PUKn)sj8%i>BQ;SOya|=LvOmqzlbq!2H49%>J4XsQqAeOi$U%m;{!{F)a=d#Wz Gp$Pz&x9*4l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/pink.png b/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/pink.png new file mode 100644 index 0000000000000000000000000000000000000000..69bf2758364825392ba06b4eed6d8ba6ff60f9f2 GIT binary patch literal 672 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIe2OdaSX9IeRPs-9+RO!>si4f z*6?XTYVIdQeWnEn|1!CEE2xFlw5zOIq%25z?W5DFX@8o_=gv3sm)cWP^`2K-Sw#1r1q@Xr60(gIe3P#_;_VJ!#yU}j#CS|t7hN7vu=mR zugy1jUNj$g_(2OC7#SED=^B{o8k&X}m|2+`TNzqv8yHv_7&P(i^g+>(o1c=IR*74~ z=U~PUKn)sj8%i>BQ;SOya|=LvOmqzlbq!2H49%>J4XsQqAeOi$U%m;{!{F)a=d#Wz Gp$Pzot?zIE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/purple.png b/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/purple.png new file mode 100644 index 0000000000000000000000000000000000000000..db3cbab891d7dfd490f3f2084a06fef4e05a60d8 GIT binary patch literal 672 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIe2OdaSX9IeRPs-9+RO!>si4f z*6?XTYVIdQeWnEn|1!CEE2xFlw5zOIq%25z?W5DFX@8o_=gv3sm)cWP^`2K-Sw#1r1q@Xr60(gIe3P#_;_VJ!#yU}j#CS|t7hN7vu=mR zugy1jUNj$g_(2OC7#SED=^B{o8k&X}m|2+`TNzqv8yHv_7&P(i^g+>(o1c=IR*74~ z=U~PUKn)sj8%i>BQ;SOya|=LvOmqzlbq!2H49%>J4XsQqAeOi$U%m;{!{F)a=d#Wz Gp$PzU;O=_> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/red.png b/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/red.png new file mode 100644 index 0000000000000000000000000000000000000000..dfecc550d09e80774f94f6756e076b47f3c33914 GIT binary patch literal 672 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fI-M26QVxT0)&5=+`ARj!fM)8RxMH%q`dag>D078&E<3F8~ID^si}I;tF0{Nbn3VD z+U>^{E)nULX5o*rSGq9Ep(Mt!B*%BPEs!&rR0GM?cc6Klt*1>IG%@84OsL*v)x z8$2(X4?KLNZ^yVNzS{biA@eJXDGkc|o3w(ahGl#I75>4r+51i7*TlCgfMKax;u=ws zl30>zm0Xkxq!^40jEr;*Omz)SLk!HUOpUD!Ewv2{tPBjA_;&iBXvob^$xN%nt>JSp z;|HJy4Y&;@nYpROC5gEOAU!6!28Ox@CLxAqR>p=_rWO!OT$3-~1nOb%boFyt=akR{ E08IGoegFUf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/white.png b/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier/white.png new file mode 100644 index 0000000000000000000000000000000000000000..bf00c8adcc791f10d0d3c32af000bedddb5a2eaf GIT binary patch literal 669 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIlBSEK+1*-JcqUD;nSvIxjqP2TwP3s8@)r;B5V#p$DyZ1b251zOJv7O{p; z3sQ4GA?h1r+!EzgLWDHEnC#dL5Y zgC1v}l90^CExfzWl;%!}V0_*2d}1RHTj%nW1m*{iI8VrGPIBD3v@2vmSIE-Pl%IPl zKdlj-r><;PwNt99VIlu|X9w}52}%o@8Ce*1Ua7CEm?h6}?tVg4mvQXr^V$35q_4l> zSTg^H3PWHzi%jFX!})pt=f%nYdMN!s=FGt}jK#+*;~DNTv38tV&|NkA{+)F@G=6Qq z!SkZ|z{5xSc8q)CtF3<-GQYBz(xAM*Nh@e-Shn|H;U7$!z27u`O?JB6hTQy=%(P0}8a@Xz zegJCFfZI@#nVVW%l9*cn(qp1)V5nH=O_7{vS0`gXqH~#zr)T8U^;uvCa`sgIvJSIbd*0X{| ztl`sw)Z9;q`b-ND{$+CSR!|G8X;)dbNLi5b+DE5T)BZG<&z*1NFSVzp>OHTvvY6AU z-_~olA6vLYq+6PWKgwR|!Yqf97{`(v-_?>kG(ImX`P_BDYh?zYlP>iE1OmAl&Wf2$iLp%K|E=K(n4lN7KWWy>gy_I$upe0pAgk$9DDkF_I^3( z>u)%g%)g<+5SY#))41+%e%}9iaq_<&Nq`9j6v_SIxeEXWb5s zUz>06yl6h~@R7b9tBYv|LrD}<5 zL`h0wNvc(HQ7VvPFfuSQ(ls#EH8c$|Ftai>wlcKTHZZU4TynH$NpatrE9} z&%ulzfEqO5Hk4%MrWThZ<`#hTnCKc9>Kd4Y7@Aob8(NuKKrC@hzI+p?hr!d;&t;uc GLK6VKAnuj` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier_mask.png b/src/main/resources/assets/overdrive_that_matters/textures/block/storage_power_supplier_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..7178545762d3b473c2ba5014dd5a94c7df4919ac GIT binary patch literal 1221 zcmV;$1UmbPP)EX>4Tx04R}tkvmAkP!xv$rb>%c94sQ@kfA!+#TSmHibb$c+6t{YnB4RQO&XFE z7e~Rh;NWAi>fqw6tAnc`2tGiZ9h?+hq{MTRLW>v=T<*tz&;N7pxq#5DGS%#f0jg#h z=|o)2z=x)?xH-)yYJ8HR|+Nrd?Im->4rtTK|H%@ z>74h8!>lYR#OK5l23?T&k?XR{Z=6dG3p_JyWYhD+VPdh=#c~(3vY`@B6Gs$PqkJLf zvch?bvs$gQ_C5IvLj`Rm!*yDtNMH#`q#!~@9TikzAxgVOiitFx$36Tbjz2{%nOqex zax9<*6_Voz|AXJNHH%Y|Zc-=?^uE~k#~2XU1zHW;{yw(t)(PN$2ClS@zt#liK1pwM zw8#-Kunk;XcQknqxZDATpLEHP9LY~hC>DYDGy0}HFn9~}t+{h+pX2la$kMEqZ-9eC zV7x@x>mKh8cF*nKp7#8H0G6F{wGk}A8UO$Q24YJ`L;(K){{a7>y{D4^000SaNLh0L z01m?d01m?e$8V@)00007bV*G`2j~F=5Faz@Z9z}~00O~DL_t(&-tAdCj_NQJJ)TKN zK`JV$YypbwfHYYNtN?13K*=g-oF)xT8n%!s5>hH>1Nc=&iO1hK3~wZkgoL@iw(sA* z5Y9RJSg+TE@qWKYmSv!n0sv;S*?^v=DdISOjJ(HX58kQdcSW}^pbAQYxUIcvZsnTg&vfjrMi1Ga=>qsyBL zsb$=5x51d$Ql||f?#F^qO0ifhc#P5drv2Zy2X0hOdS=>g#T@pu3LmdmBr#!b_pX&T(`_aFhHu_h3FE>c>{u`R~O z27eSu9OcKA+FM7VNqXRaFrkzo3g0 z9i?fiOsiE@p{{ErNrJkr0RXys(Wi^=;&)YzaL$Bn+mg0z`(s$<8~MFcafk_QRnVFT z(lq4(&gsreDFtI}@S&7~_rMtAj4`f*ivDLZA<+@~QgmGh0MPk^icSb2e_I2LF>aFD z6a@ef$8nejL^c}(AKu8-V~e67o6Ux+#=G5)5n@nqdkPM6T*rZT2fB@adq- jU2&KHj6V3_gAe`zP@m2atGZ1d00000NkvXXu0mjfCV4QT literal 0 HcmV?d00001 From 5d44a26493d317d40043106166a740285afa1d68 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 5 Jan 2024 00:32:30 +0700 Subject: [PATCH 3/8] Fix pattern monitor rotation --- .../models/block/matter_panel.json | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/main/resources/assets/overdrive_that_matters/models/block/matter_panel.json b/src/main/resources/assets/overdrive_that_matters/models/block/matter_panel.json index 1cb704ba5..37a1363fb 100644 --- a/src/main/resources/assets/overdrive_that_matters/models/block/matter_panel.json +++ b/src/main/resources/assets/overdrive_that_matters/models/block/matter_panel.json @@ -1,22 +1,23 @@ { + "credit": "Made with Blockbench", "parent": "block/block", "texture_size": [32, 32], "textures": { - "texture": "overdrive_that_matters:block/matter_panel", - "particle": "overdrive_that_matters:block/matter_panel" + "particle": "overdrive_that_matters:block/matter_panel", + "texture": "overdrive_that_matters:block/matter_panel" }, -"elements": [ + "elements": [ { - "from": [ 0, 0, 0 ], - "to": [ 16, 16, 6 ], + "from": [0, 0, 10], + "to": [16, 16, 16], "faces": { - "down": {"uv": [ 8, 0, 16, 3 ], "texture": "#texture" }, - "up": {"uv": [ 8, 0, 16, 3 ], "rotation": 180, "texture": "#texture" }, - "north": {"uv": [ 0, 8, 8, 16 ], "texture": "#texture" }, - "south": {"uv": [ 0, 0, 8, 8 ], "texture": "#texture" }, - "west": {"uv": [ 8, 0, 16, 3 ], "rotation": 90, "texture": "#texture" }, - "east": {"uv": [ 8, 0, 16, 3 ], "rotation": 270, "texture": "#texture" } + "north": {"uv": [0, 0, 8, 8], "texture": "#texture"}, + "east": {"uv": [8, 0, 16, 3], "rotation": 90, "texture": "#texture"}, + "south": {"uv": [0, 8, 8, 16], "texture": "#texture"}, + "west": {"uv": [8, 0, 16, 3], "rotation": 270, "texture": "#texture"}, + "up": {"uv": [8, 0, 16, 3], "texture": "#texture"}, + "down": {"uv": [8, 0, 16, 3], "rotation": 180, "texture": "#texture"} } } ] -} +} \ No newline at end of file From a56dbd60f6fbcc5dfcd7b1749a5aecebdfb0e396 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 5 Jan 2024 00:38:53 +0700 Subject: [PATCH 4/8] Switch render mode to cutout for holo sign and matter replicator --- .../assets/overdrive_that_matters/models/block/holo_sign.json | 2 +- .../overdrive_that_matters/models/block/matter_replicator.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/overdrive_that_matters/models/block/holo_sign.json b/src/main/resources/assets/overdrive_that_matters/models/block/holo_sign.json index fb314ebd6..70537dc8e 100644 --- a/src/main/resources/assets/overdrive_that_matters/models/block/holo_sign.json +++ b/src/main/resources/assets/overdrive_that_matters/models/block/holo_sign.json @@ -1,7 +1,7 @@ { "credit": "Made with Blockbench", "parent": "block/cube_all", - "render_type": "translucent", + "render_type": "cutout", "textures": { "0": "overdrive_that_matters:block/holo_sign", "particle": "overdrive_that_matters:block/holo_sign" diff --git a/src/main/resources/assets/overdrive_that_matters/models/block/matter_replicator.json b/src/main/resources/assets/overdrive_that_matters/models/block/matter_replicator.json index db7a07bee..c0608c9c9 100644 --- a/src/main/resources/assets/overdrive_that_matters/models/block/matter_replicator.json +++ b/src/main/resources/assets/overdrive_that_matters/models/block/matter_replicator.json @@ -1,7 +1,7 @@ { "credit": "Made with Blockbench", "parent": "block/block", - "render_type": "translucent", + "render_type": "cutout", "texture_size": [32, 32], "textures": { "1": "overdrive_that_matters:block/matter_replicator_base", From 796f7fdc986bf479418d3580814077afad5eb7b6 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 5 Jan 2024 00:45:21 +0700 Subject: [PATCH 5/8] Fix drive viewer model --- .../ru/dbotthepony/mc/otm/datagen/blocks/ComplexBlockStates.kt | 3 ++- .../kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt | 1 + .../overdrive_that_matters/models/item/drive_viewer.json | 3 --- 3 files changed, 3 insertions(+), 4 deletions(-) delete mode 100644 src/main/resources/assets/overdrive_that_matters/models/item/drive_viewer.json diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/ComplexBlockStates.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/ComplexBlockStates.kt index 730923d29..f0c14a863 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/ComplexBlockStates.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/ComplexBlockStates.kt @@ -7,6 +7,7 @@ import ru.dbotthepony.mc.otm.block.matter.PatternStorageBlock import ru.dbotthepony.mc.otm.block.storage.DriveViewerBlock import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom import ru.dbotthepony.mc.otm.core.math.yRotationBlockstateNorth +import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.datagen.modLocation import ru.dbotthepony.mc.otm.registry.MBlocks @@ -23,7 +24,7 @@ fun addComplexBlockStates(provider: MatteryBlockStateProvider) { for (workState in WorkerState.SEMI_WORKER_STATE.possibleValues) { part() - .modelFile(provider.models().getExistingFile(modLocation("block/drive_viewer_${workState.name.lowercase()}"))) + .modelFile(provider.models().getExistingFile(modLocation("block/${block.registryName!!.path}_${workState.name.lowercase()}"))) .rotationY(facing.front.yRotationBlockstateNorth()) .addModel() .condition(WorkerState.SEMI_WORKER_STATE, workState) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt index cd6b384e7..f397d23fa 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt @@ -171,6 +171,7 @@ fun addItemModels(provider: MatteryItemModelProvider) { provider.coloredWithBaseBlock(MItems.MATTER_BOTTLER, "matter_bottler", "_idle") provider.coloredWithBaseBlock(MItems.MATTER_SCANNER, "matter_scanner", "_idle") provider.coloredWithBaseBlock(MItems.MATTER_REPLICATOR, "matter_replicator", "_idle") + provider.coloredWithBaseBlock(MItems.DRIVE_VIEWER, "drive_viewer", "_idle") provider.block(MItems.MATTER_CABLE, "matter_cable_core") provider.coloredWithBaseBlock(MItems.MATTER_DECOMPOSER, "matter_decomposer", "_idle") provider.block(MItems.ENERGY_SERVO, "energy_servo") diff --git a/src/main/resources/assets/overdrive_that_matters/models/item/drive_viewer.json b/src/main/resources/assets/overdrive_that_matters/models/item/drive_viewer.json deleted file mode 100644 index 94fab8fd3..000000000 --- a/src/main/resources/assets/overdrive_that_matters/models/item/drive_viewer.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "overdrive_that_matters:block/drive_viewer_idle" -} \ No newline at end of file From ef4f65656c17be73d6bd83a19264b7f3662eb446 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 5 Jan 2024 14:16:01 +0700 Subject: [PATCH 6/8] Fix battery bank not being painted in world --- .../kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockModels.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockModels.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockModels.kt index 70c9388cb..531d0fd89 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockModels.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockModels.kt @@ -16,7 +16,7 @@ fun addBlockModels(provider: MatteryBlockModelProvider) { colored(MBlocks.MATTER_RECONSTRUCTOR, listOf("0", "particle")) colored("matter_capacitor_bank", listOf("1", "particle"), "mattercapacitorbank_frame") - colored("battery_bank", listOf("1", "particle"), "batterybank_frame") + colored("battery_bank", listOf("0", "particle"), "batterybank_frame") colored("android_charger", "_base", listOf("0", "particle")) colored("android_charger", "_middle", listOf("0", "particle")) From 2dcfa99f9c7475bda7429f2232c88a49d72efc17 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 5 Jan 2024 19:18:10 +0700 Subject: [PATCH 7/8] Microwave oven in-world rendering --- .../tech/AbstractPoweredFurnaceBlockEntity.kt | 34 +++++++-- .../blockentity/MatterReplicatorRenderer.kt | 2 +- .../blockentity/PoweredSmokerRenderer.kt | 69 +++++++++++++++++++ .../mc/otm/core/util/Savetables.kt | 5 +- .../mc/otm/registry/MBlockEntities.kt | 1 + 5 files changed, 104 insertions(+), 7 deletions(-) create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/PoweredSmokerRenderer.kt diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/AbstractPoweredFurnaceBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/AbstractPoweredFurnaceBlockEntity.kt index b8ea06589..ed41c96f8 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/AbstractPoweredFurnaceBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/AbstractPoweredFurnaceBlockEntity.kt @@ -5,6 +5,7 @@ import net.minecraft.server.level.ServerLevel import net.minecraft.world.entity.player.Inventory import net.minecraft.world.entity.player.Player import net.minecraft.world.inventory.AbstractContainerMenu +import net.minecraft.world.item.ItemStack import net.minecraft.world.item.crafting.AbstractCookingRecipe import net.minecraft.world.item.crafting.BlastingRecipe import net.minecraft.world.item.crafting.RecipeType @@ -44,19 +45,31 @@ sealed class AbstractPoweredFurnaceBlockEntity

, val secondaryRecipeType: RecipeType?, - val config: WorkerBalanceValues -) : MatteryWorkerBlockEntity(type, blockPos, blockState, ItemJob.CODEC, 2) { + val config: WorkerBalanceValues, + maxJobs: Int = 2 +) : MatteryWorkerBlockEntity(type, blockPos, blockState, ItemJob.CODEC, maxJobs) { final override val upgrades = UpgradeContainer(this::markDirtyFast, 2, UpgradeType.BASIC_PROCESSING) final override val energy = ProfiledEnergyStorage(WorkerEnergyStorage(this::energyLevelUpdated, upgrades.transform(config))) - val inputs = immutableList(2) { MatteryContainer(this::itemContainerUpdated, 1) } - val outputs = immutableList(2) { MatteryContainer(this::itemContainerUpdated, 1) } + val inputs = immutableList(maxJobs) { MatteryContainer(this::itemContainerUpdated, 1) } + val outputs = immutableList(maxJobs) { MatteryContainer(this::itemContainerUpdated, 1) } init { inputs.forEach { addDroppableContainer(it) } outputs.forEach { addDroppableContainer(it) } } + inner class SyncSlot { + var inputItem by synchronizer.item(observe = false) + var outputItem by synchronizer.item(observe = false) + var progress by synchronizer.float().property + var visualRotation = 0f + } + + var lastRender = 0L + + val syncSlots = immutableList(maxJobs) { SyncSlot() } + val experience = ExperienceStorage(config::maxExperienceStored).also(::addNeighbourListener) val energyConfig = ConfigurableEnergy(energy) val itemConfig = ConfigurableItemHandler( @@ -90,11 +103,19 @@ sealed class AbstractPoweredFurnaceBlockEntity

, id: Int) { if (outputs[id].fullyAddItem(status.job.itemStack)) { experience.storeExperience(status.experience, this) + syncSlots[id].inputItem = ItemStack.EMPTY + syncSlots[id].outputItem = ItemStack.EMPTY + syncSlots[id].progress = 0f } else { status.noItem() } } + override fun onJobTick(status: JobStatus, id: Int) { + super.onJobTick(status, id) + syncSlots[id].progress = status.workProgress + } + override fun computeNextJob(id: Int): JobContainer { if (!energy.batteryLevel.isPositive) return JobContainer.noEnergy() @@ -129,9 +150,14 @@ sealed class AbstractPoweredFurnaceBlockEntity

30_000_000L) { - tile.particleRenderScore = tile.particleRenderScore % 30_000_000L + tile.particleRenderScore %= 30_000_000L if (rand.nextDouble() > 0.75 && !isPaused && tile.blockState[WorkerState.WORKER_STATE] == WorkerState.WORKING) { val (x, y, z) = tile.blockPos diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/PoweredSmokerRenderer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/PoweredSmokerRenderer.kt new file mode 100644 index 000000000..5790041a7 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/PoweredSmokerRenderer.kt @@ -0,0 +1,69 @@ +package ru.dbotthepony.mc.otm.client.render.blockentity + +import com.mojang.blaze3d.vertex.PoseStack +import net.minecraft.client.renderer.MultiBufferSource +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider +import net.minecraft.world.item.ItemDisplayContext +import ru.dbotthepony.mc.otm.block.entity.tech.AbstractPoweredFurnaceBlockEntity +import ru.dbotthepony.mc.otm.core.math.normalizeAngle +import ru.dbotthepony.mc.otm.core.math.rotateY + +class PoweredSmokerRenderer(private val context: BlockEntityRendererProvider.Context) : BlockEntityRenderer> { + override fun render(tile: AbstractPoweredFurnaceBlockEntity<*, *>, partialTick: Float, pose: PoseStack, buffers: MultiBufferSource, packedLight: Int, packedOverlay: Int) { + val diff = System.nanoTime() - tile.lastRender + tile.lastRender = System.nanoTime() + + for (slot in tile.syncSlots) { + if (slot.inputItem.isEmpty && slot.outputItem.isEmpty) continue + slot.visualRotation = normalizeAngle(slot.visualRotation + diff / 400_000_000f) + + pose.pushPose() + pose.translate(0.625f, 0.5f, 0.5f) + pose.scale(0.25f, 0.25f, 0.25f) + + pose.rotateY(slot.visualRotation) + + if (slot.progress <= 0.8f && !slot.inputItem.isEmpty) { + val model = context.itemRenderer.getModel( + slot.inputItem, + tile.level, + null, + 0 + ) + + context.itemRenderer.render( + slot.inputItem, + ItemDisplayContext.NONE, + false, + pose, + buffers, + packedLight, + packedOverlay, + model + ) + } else if (slot.progress > 0.8f && !slot.outputItem.isEmpty) { + val model = context.itemRenderer.getModel( + slot.outputItem, + tile.level, + null, + 0 + ) + + context.itemRenderer.render( + slot.outputItem, + ItemDisplayContext.NONE, + false, + pose, + buffers, + packedLight, + packedOverlay, + model + ) + } + + pose.popPose() + break + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/Savetables.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/Savetables.kt index bd8a2b099..e348fb661 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/Savetables.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/Savetables.kt @@ -52,9 +52,10 @@ class Savetables : INBTSerializable { return stateful(getter, name, T::class.java) } - inline fun , reified T : Tag> stateful(values: List, name: String): ImmutableList> { + inline fun , reified T : Tag> stateful(values: Collection, name: String): ImmutableList> { + val iterator = values.iterator() return immutableList(values.size) { - stateful(values[it], "${name}_$it", T::class.java) + stateful(iterator.next(), "${name}_$it", T::class.java) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlockEntities.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlockEntities.kt index 4795cabdc..0c6d5bab5 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlockEntities.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlockEntities.kt @@ -118,6 +118,7 @@ object MBlockEntities { BlockEntityRenderers.register(MATTER_RECONSTRUCTOR, ::MatterReconstructorRenderer) BlockEntityRenderers.register(MATTER_REPLICATOR, ::MatterReplicatorRenderer) BlockEntityRenderers.register(MATTER_SCANNER, ::MatterScannerRenderer) + BlockEntityRenderers.register(POWERED_SMOKER, ::PoweredSmokerRenderer) BlockEntityRenderers.register(HOLO_SIGN, ::HoloSignRenderer) BlockEntityRenderers.register(FLUID_TANK, ::FluidTankRenderer) } From e55764c10de3268c7f1cb34b8b634ca9a0649e80 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 5 Jan 2024 21:35:14 +0700 Subject: [PATCH 8/8] Custom deferred register with parallel entry initialization --- .../mc/otm/registry/AndroidFeatures.kt | 30 ++-- .../ru/dbotthepony/mc/otm/registry/Ext.kt | 25 --- .../mc/otm/registry/MBlockEntities.kt | 6 +- .../ru/dbotthepony/mc/otm/registry/MBlocks.kt | 4 +- .../mc/otm/registry/MCreativeTabs.kt | 2 +- .../mc/otm/registry/MDeferredRegister.kt | 157 ++++++++++++++++++ .../mc/otm/registry/MEntityTypes.kt | 2 +- .../ru/dbotthepony/mc/otm/registry/MFluids.kt | 4 +- .../mc/otm/registry/MItemFunctionTypes.kt | 2 +- .../ru/dbotthepony/mc/otm/registry/MItems.kt | 2 +- .../mc/otm/registry/MLootItemConditions.kt | 2 +- .../ru/dbotthepony/mc/otm/registry/MMenus.kt | 70 ++++---- .../dbotthepony/mc/otm/registry/MRecipes.kt | 6 +- .../dbotthepony/mc/otm/registry/MRegistry.kt | 4 +- .../mc/otm/registry/MSoundEvents.kt | 18 +- .../objects/ColoredDecorativeBlock.kt | 10 +- .../otm/registry/objects/DecorativeBlock.kt | 13 +- .../objects/IBlockItemRegistryAcceptor.kt | 6 +- .../objects/StripedColoredDecorativeBlock.kt | 9 +- 19 files changed, 253 insertions(+), 119 deletions(-) delete mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/registry/Ext.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/registry/MDeferredRegister.kt diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/AndroidFeatures.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/AndroidFeatures.kt index eb4b7cb9c..c8c195727 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/AndroidFeatures.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/AndroidFeatures.kt @@ -8,22 +8,22 @@ import ru.dbotthepony.mc.otm.android.DummyAndroidFeature import ru.dbotthepony.mc.otm.android.feature.* object AndroidFeatures { - private val registry = DeferredRegister.create(MRegistry.ANDROID_FEATURES_KEY, OverdriveThatMatters.MOD_ID) + private val registry = MDeferredRegister(MRegistry.ANDROID_FEATURES_KEY) - val AIR_BAGS: AndroidFeatureType by registry.register(MNames.AIR_BAGS) { AndroidFeatureType(::DummyAndroidFeature) } - val STEP_ASSIST: AndroidFeatureType by registry.register(MNames.STEP_ASSIST) { AndroidFeatureType(::StepAssistFeature) } - val SWIM_BOOSTERS: AndroidFeatureType by registry.register(MNames.SWIM_BOOSTERS) { AndroidFeatureType(::SwimBoostersFeature) } - val LIMB_OVERCLOCKING: AndroidFeatureType by registry.register(MNames.LIMB_OVERCLOCKING) { AndroidFeatureType(::LimbOverclockingFeature) } - val ATTACK_BOOST: AndroidFeatureType by registry.register(MNames.ATTACK_BOOST) { AndroidFeatureType(::AttackBoostFeature) } - val NANOBOTS_REGENERATION: AndroidFeatureType by registry.register(MNames.NANOBOTS_REGENERATION) { AndroidFeatureType(::NanobotsRegenerationFeature) } - val NANOBOTS_ARMOR: AndroidFeatureType by registry.register(MNames.NANOBOTS_ARMOR) { AndroidFeatureType(::NanobotsArmorFeature) } - val EXTENDED_REACH: AndroidFeatureType by registry.register(MNames.EXTENDED_REACH) { AndroidFeatureType(::ExtendedReachFeature) } - val NIGHT_VISION: AndroidFeatureType by registry.register(MNames.NIGHT_VISION) { AndroidFeatureType(::NightVisionFeature) } - val SHOCKWAVE: AndroidFeatureType by registry.register(MNames.SHOCKWAVE) { AndroidFeatureType(::ShockwaveFeature) } - val ITEM_MAGNET: AndroidFeatureType by registry.register(MNames.ITEM_MAGNET) { AndroidFeatureType(::ItemMagnetFeature) } - val FALL_DAMPENERS: AndroidFeatureType by registry.register(MNames.FALL_DAMPENERS) { AndroidFeatureType(::FallDampenersFeature) } - val JUMP_BOOST: AndroidFeatureType by registry.register(MNames.JUMP_BOOST) { AndroidFeatureType(::JumpBoostFeature) } - val ENDER_TELEPORTER: AndroidFeatureType by registry.register(MNames.ENDER_TELEPORTER) { AndroidFeatureType(::EnderTeleporterFeature) } + val AIR_BAGS by registry.register(MNames.AIR_BAGS) { AndroidFeatureType(::DummyAndroidFeature) } + val STEP_ASSIST by registry.register(MNames.STEP_ASSIST) { AndroidFeatureType(::StepAssistFeature) } + val SWIM_BOOSTERS by registry.register(MNames.SWIM_BOOSTERS) { AndroidFeatureType(::SwimBoostersFeature) } + val LIMB_OVERCLOCKING by registry.register(MNames.LIMB_OVERCLOCKING) { AndroidFeatureType(::LimbOverclockingFeature) } + val ATTACK_BOOST by registry.register(MNames.ATTACK_BOOST) { AndroidFeatureType(::AttackBoostFeature) } + val NANOBOTS_REGENERATION by registry.register(MNames.NANOBOTS_REGENERATION) { AndroidFeatureType(::NanobotsRegenerationFeature) } + val NANOBOTS_ARMOR by registry.register(MNames.NANOBOTS_ARMOR) { AndroidFeatureType(::NanobotsArmorFeature) } + val EXTENDED_REACH by registry.register(MNames.EXTENDED_REACH) { AndroidFeatureType(::ExtendedReachFeature) } + val NIGHT_VISION by registry.register(MNames.NIGHT_VISION) { AndroidFeatureType(::NightVisionFeature) } + val SHOCKWAVE by registry.register(MNames.SHOCKWAVE) { AndroidFeatureType(::ShockwaveFeature) } + val ITEM_MAGNET by registry.register(MNames.ITEM_MAGNET) { AndroidFeatureType(::ItemMagnetFeature) } + val FALL_DAMPENERS by registry.register(MNames.FALL_DAMPENERS) { AndroidFeatureType(::FallDampenersFeature) } + val JUMP_BOOST by registry.register(MNames.JUMP_BOOST) { AndroidFeatureType(::JumpBoostFeature) } + val ENDER_TELEPORTER by registry.register(MNames.ENDER_TELEPORTER) { AndroidFeatureType(::EnderTeleporterFeature) } internal fun register(bus: IEventBus) { registry.register(bus) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/Ext.kt deleted file mode 100644 index c6bddbba5..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/Ext.kt +++ /dev/null @@ -1,25 +0,0 @@ -package ru.dbotthepony.mc.otm.registry - -import net.minecraft.world.item.DyeColor -import net.minecraftforge.registries.DeferredRegister -import net.minecraftforge.registries.RegistryObject -import ru.dbotthepony.mc.otm.core.collect.SupplierMap -import java.util.function.Supplier -import kotlin.reflect.KProperty - -operator fun RegistryObject.getValue(thisRef: Any, property: KProperty<*>): T { - return get() -} - -internal fun DeferredRegister.colored(prefix: String, factory: (color: DyeColor) -> R): Map { - return SupplierMap(MRegistry.DYE_ORDER.map { it to register(prefix + "_" + it.name.lowercase()) { factory.invoke(it) } }) -} - -internal fun DeferredRegister.coloredWithBase(prefix: String, factory: (color: DyeColor?) -> R): Map { - val values = ArrayList>>() - - values.add(null to register(prefix) { factory.invoke(null) }) - MRegistry.DYE_ORDER.forEach { values.add(it to register(prefix + "_" + it.name.lowercase()) { factory.invoke(it) }) } - - return SupplierMap(values) -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlockEntities.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlockEntities.kt index 0c6d5bab5..985ace44d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlockEntities.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlockEntities.kt @@ -38,13 +38,13 @@ import java.util.function.Supplier @Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS") // Type<*> is unused in BlockEntityType.Builder object MBlockEntities { - private val registry = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, OverdriveThatMatters.MOD_ID) + private val registry = MDeferredRegister(ForgeRegistries.BLOCK_ENTITY_TYPES) - private fun register(name: String, factory: BlockEntityType.BlockEntitySupplier, vararg blocks: Supplier): RegistryObject> { + private fun register(name: String, factory: BlockEntityType.BlockEntitySupplier, vararg blocks: Supplier): MDeferredRegister<*>.Entry> { return registry.register(name) { BlockEntityType.Builder.of(factory, *blocks.map { it.get() }.toTypedArray()).build(null) } } - private fun register(name: String, factory: BlockEntityType.BlockEntitySupplier, blocks: Map<*, Block>): RegistryObject> { + private fun register(name: String, factory: BlockEntityType.BlockEntitySupplier, blocks: Map<*, Block>): MDeferredRegister<*>.Entry> { return registry.register(name) { BlockEntityType.Builder.of(factory, *blocks.values.toTypedArray()).build(null) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlocks.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlocks.kt index 47b5931b3..baa5d5a73 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlocks.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlocks.kt @@ -80,7 +80,7 @@ import ru.dbotthepony.mc.otm.shapes.BlockShapes import java.util.function.Supplier object MBlocks { - private val registry = DeferredRegister.create(ForgeRegistries.BLOCKS, OverdriveThatMatters.MOD_ID) + private val registry = MDeferredRegister(ForgeRegistries.BLOCKS) internal fun register(bus: IEventBus) { registry.register(bus) @@ -222,7 +222,7 @@ object MBlocks { val TRITANIUM_TRAPDOOR = registry.coloredWithBase(MNames.TRITANIUM_TRAPDOOR, ::TritaniumTrapdoorBlock) - val TRITANIUM_STRIPED_BLOCK: Block by registry.register(MNames.TRITANIUM_STRIPED_BLOCK) { Block( + val TRITANIUM_STRIPED_BLOCK: Block by registry.register(MNames.TRITANIUM_STRIPED_BLOCK, true) { Block( BlockBehaviour.Properties.of() .mapColor(MapColor.COLOR_LIGHT_BLUE) .sound(SoundType.BASALT) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MCreativeTabs.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MCreativeTabs.kt index 71673402b..1924b60c3 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MCreativeTabs.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MCreativeTabs.kt @@ -273,7 +273,7 @@ private fun addDecorativeTabItems(consumer: CreativeModeTab.Output) { } object MCreativeTabs { - private val registry = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, OverdriveThatMatters.MOD_ID) + private val registry = MDeferredRegister(Registries.CREATIVE_MODE_TAB) val MAIN: CreativeModeTab by registry.register("main") { CreativeModeTab.builder() diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MDeferredRegister.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MDeferredRegister.kt new file mode 100644 index 000000000..3cc38196e --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MDeferredRegister.kt @@ -0,0 +1,157 @@ +package ru.dbotthepony.mc.otm.registry + +import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap +import net.minecraft.Util +import net.minecraft.core.Registry +import net.minecraft.resources.ResourceKey +import net.minecraft.resources.ResourceLocation +import net.minecraft.world.item.DyeColor +import net.minecraftforge.eventbus.api.IEventBus +import net.minecraftforge.registries.IForgeRegistry +import net.minecraftforge.registries.RegisterEvent +import org.apache.logging.log4j.LogManager +import ru.dbotthepony.mc.otm.OverdriveThatMatters +import ru.dbotthepony.mc.otm.SystemTime +import ru.dbotthepony.mc.otm.core.collect.SupplierMap +import java.util.LinkedList +import java.util.concurrent.FutureTask +import java.util.concurrent.locks.LockSupport +import java.util.function.Supplier +import kotlin.reflect.KProperty + +/** + * DeferredRegister which allows parallel initialization + */ +class MDeferredRegister(val registry: ResourceKey>, val modId: String = OverdriveThatMatters.MOD_ID) { + constructor(registry: IForgeRegistry, modId: String = OverdriveThatMatters.MOD_ID) : this(registry.registryKey, modId) + + private val entries = Object2ObjectLinkedOpenHashMap>() + private var allowRegistration = true + private var eventRegistered = false + private val stages = ArrayList() + + private inner class RegistrationStage(val serial: Boolean) { + private val entries = ArrayList>() + + fun add(entry: Entry) { + entries.add(entry) + } + + fun run(): List> { + if (serial) { + LOGGER.debug("Serial registration of {} entries from {} for {}...", entries.size, modId, registry.location()) + val t = SystemTime() + entries.forEach { it.initialize() } + LOGGER.debug("Serial registration of {} entries from {} for {} took {} ms", entries.size, modId, registry.location(), t.millis) + } else { + LOGGER.debug("Parallel registration of {} entries from {} for {}...", entries.size, modId, registry.location()) + val t = SystemTime() + val futures = LinkedList>() + entries.forEach { futures.add(FutureTask(it::initialize)) } + futures.forEach { Util.backgroundExecutor().submit(it) } + + while (futures.isNotEmpty()) { + futures.removeIf { it.run(); it.isDone } // help executor threads to minimize thread stalling + // especially true when executor threads are busy with work created by other mods + // so we keep worst-case scenario where every registry entry is initialized and registered serially as it was before + LockSupport.parkNanos(1_000_000L) + } + + // memory barrier to avoid specifying _value as @Volatile + LockSupport.parkNanos(1_000_000L) + + LOGGER.debug("Parallel registration of {} entries from {} for {} took {} ms", entries.size, modId, registry.location(), t.millis) + } + + return entries + } + } + + inner class Entry(val name: String, private val factory: Supplier, serial: Boolean) : Supplier<@UnsafeVariance T>, Lazy { + constructor(name: String, factory: Supplier) : this(name, factory, false) + + init { + check(allowRegistration) { "Unable to register new entries after RegisterEvent has been fired" } + require(entries.put(name, this) == null) { "Duplicate entry $name for registry $registry" } + + if (stages.isEmpty() || stages.last().serial != serial) { + val stage = RegistrationStage(serial) + stage.add(this) + stages.add(stage) + } else { + stages.last().add(this) + } + } + + val key = ResourceLocation(modId, name) + private var _value: T? = null + + override val value: T get() { + return _value ?: throw IllegalStateException("Trying to access $name of $registry before it is initialized") + } + + override fun isInitialized(): Boolean { + return _value != null + } + + override fun get(): T { + return value + } + + operator fun getValue(receiver: Any?, property: KProperty<*>): T { + return value + } + + fun initialize(): T { + check(_value == null) { "Already initialized $name of $registry!" } + + val getValue = try { + factory.get() + } catch (err: Throwable) { + throw RuntimeException("Unable to initialize registry entry $name of $registry", err) + } + + _value = getValue + return value + } + } + + fun colored(prefix: String, factory: (color: DyeColor) -> T): Map { + return SupplierMap(MRegistry.DYE_ORDER.map { it to Entry(prefix + "_" + it.name.lowercase()) { factory.invoke(it) } }) + } + + fun coloredWithBase(prefix: String, factory: (color: DyeColor?) -> T): Map { + val values = ArrayList>>() + + values.add(null to Entry(prefix) { factory.invoke(null) }) + MRegistry.DYE_ORDER.forEach { values.add(it to Entry(prefix + "_" + it.name.lowercase()) { factory.invoke(it) }) } + + return SupplierMap(values) + } + + fun register(name: String, factory: Supplier) = Entry(name, factory) + fun register(name: String, factory: Supplier, serial: Boolean) = Entry(name, factory, serial) + fun register(name: String, serial: Boolean, factory: Supplier) = Entry(name, factory, serial) + + private fun onRegisterEvent(event: RegisterEvent) { + if (event.registryKey == registry) { + allowRegistration = false + + for (stage in stages) { + stage.run().forEach { + event.register(registry, it.key, it) + } + } + } + } + + fun register(bus: IEventBus) { + check(!eventRegistered) { "Already registered!" } + eventRegistered = true + bus.addListener(this::onRegisterEvent) + } + + companion object { + private val LOGGER = LogManager.getLogger() + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MEntityTypes.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MEntityTypes.kt index dcdb9d758..237fa3885 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MEntityTypes.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MEntityTypes.kt @@ -17,7 +17,7 @@ import ru.dbotthepony.mc.otm.entity.MinecartCargoCrate import ru.dbotthepony.mc.otm.entity.PlasmaProjectile object MEntityTypes { - private val registry: DeferredRegister> = DeferredRegister.create(ForgeRegistries.ENTITY_TYPES, OverdriveThatMatters.MOD_ID) + private val registry = MDeferredRegister(ForgeRegistries.ENTITY_TYPES) val PLASMA: EntityType<*> by registry.register(MNames.PLASMA) { EntityType.Builder.of({ _, level -> PlasmaProjectile(level) }, MobCategory.MISC).sized(0.4f, 0.4f).build(MNames.PLASMA) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MFluids.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MFluids.kt index c879250cc..2212399a4 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MFluids.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MFluids.kt @@ -15,8 +15,8 @@ import ru.dbotthepony.mc.otm.OverdriveThatMatters import java.util.function.Consumer object MFluids { - private val types: DeferredRegister = DeferredRegister.create(ForgeRegistries.FLUID_TYPES, OverdriveThatMatters.MOD_ID) - private val fluids: DeferredRegister = DeferredRegister.create(ForgeRegistries.FLUIDS, OverdriveThatMatters.MOD_ID) + private val types = MDeferredRegister(ForgeRegistries.Keys.FLUID_TYPES) + private val fluids = MDeferredRegister(ForgeRegistries.FLUIDS) internal fun register(bus: IEventBus) { types.register(bus) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItemFunctionTypes.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItemFunctionTypes.kt index 16a3b4d89..89052a1a9 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItemFunctionTypes.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItemFunctionTypes.kt @@ -10,7 +10,7 @@ import ru.dbotthepony.mc.otm.item.ProceduralBatteryItem import ru.dbotthepony.mc.otm.item.exopack.ProceduralExopackSlotUpgradeItem object MItemFunctionTypes { - private val registry = DeferredRegister.create(Registries.LOOT_FUNCTION_TYPE, OverdriveThatMatters.MOD_ID) + private val registry = MDeferredRegister(Registries.LOOT_FUNCTION_TYPE, OverdriveThatMatters.MOD_ID) val COPY_TILE_NBT: LootItemFunctionType by registry.register("copy_tile_nbt") { LootItemFunctionType(CopyTileNbtFunction.CODEC) } val PROCEDURAL_BATTERY: LootItemFunctionType by registry.register(MNames.PROCEDURAL_BATTERY) { LootItemFunctionType(ProceduralBatteryItem.Randomizer.CODEC) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt index 087c24a1b..8c3681fec 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt @@ -48,7 +48,7 @@ import java.util.function.Supplier object MItems { private val DEFAULT_PROPERTIES = Properties() - private val registry: DeferredRegister = DeferredRegister.create(ForgeRegistries.ITEMS, OverdriveThatMatters.MOD_ID) + private val registry = MDeferredRegister(ForgeRegistries.ITEMS) private fun register(name: String, blocks: Map, properties: Properties = DEFAULT_PROPERTIES): Map { return registry.coloredWithBase(name) { color -> BlockItem(blocks[color]!!, properties) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MLootItemConditions.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MLootItemConditions.kt index 0081a28ac..29a890a59 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MLootItemConditions.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MLootItemConditions.kt @@ -15,7 +15,7 @@ import ru.dbotthepony.mc.otm.data.condition.KilledByRealPlayerOrIndirectly import ru.dbotthepony.mc.otm.data.condition.ChanceCondition object MLootItemConditions { - private val registry = DeferredRegister.create(Registries.LOOT_CONDITION_TYPE, OverdriveThatMatters.MOD_ID) + private val registry = MDeferredRegister(Registries.LOOT_CONDITION_TYPE, OverdriveThatMatters.MOD_ID) val HAS_EXOPACK: LootItemConditionType by registry.register("has_exopack") { LootItemConditionType(SingletonCodec(HasExoPackCondition)) } val CHANCE_WITH_PLAYTIME: LootItemConditionType by registry.register("chance_with_playtime") { LootItemConditionType(ChanceWithPlaytimeCondition.CODEC) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MMenus.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MMenus.kt index 25f1c43ab..9bbf88352 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MMenus.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MMenus.kt @@ -75,43 +75,43 @@ import ru.dbotthepony.mc.otm.menu.tech.PoweredFurnaceMenu import ru.dbotthepony.mc.otm.menu.tech.TwinPlatePressMenu object MMenus { - private val registry = DeferredRegister.create(ForgeRegistries.MENU_TYPES, OverdriveThatMatters.MOD_ID) + private val registry = MDeferredRegister(ForgeRegistries.MENU_TYPES) - val ANDROID_STATION: MenuType by registry.register(MNames.ANDROID_STATION) { MenuType(::AndroidStationMenu, FeatureFlags.VANILLA_SET) } - val ANDROID_CHARGER: MenuType by registry.register(MNames.ANDROID_CHARGER) { MenuType({ a, b -> AndroidChargerMenu(a, b, null as AndroidChargerBlockEntity?) }, FeatureFlags.VANILLA_SET) } - val BATTERY_BANK: MenuType by registry.register(MNames.BATTERY_BANK) { MenuType(::BatteryBankMenu, FeatureFlags.VANILLA_SET) } - val MATTER_DECOMPOSER: MenuType by registry.register(MNames.MATTER_DECOMPOSER) { MenuType(::MatterDecomposerMenu, FeatureFlags.VANILLA_SET) } - val MATTER_CAPACITOR_BANK: MenuType by registry.register(MNames.MATTER_CAPACITOR_BANK) { MenuType(::MatterCapacitorBankMenu, FeatureFlags.VANILLA_SET) } - val PATTERN_STORAGE: MenuType by registry.register(MNames.PATTERN_STORAGE) { MenuType(::PatternStorageMenu, FeatureFlags.VANILLA_SET) } - val MATTER_SCANNER: MenuType by registry.register(MNames.MATTER_SCANNER) { MenuType(::MatterScannerMenu, FeatureFlags.VANILLA_SET) } - val MATTER_PANEL: MenuType by registry.register(MNames.MATTER_PANEL) { MenuType(::MatterPanelMenu, FeatureFlags.VANILLA_SET) } - val MATTER_REPLICATOR: MenuType by registry.register(MNames.MATTER_REPLICATOR) { MenuType(::MatterReplicatorMenu, FeatureFlags.VANILLA_SET) } - val MATTER_BOTTLER: MenuType by registry.register(MNames.MATTER_BOTTLER) { MenuType(::MatterBottlerMenu, FeatureFlags.VANILLA_SET) } - val DRIVE_VIEWER: MenuType by registry.register(MNames.DRIVE_VIEWER) { MenuType(::DriveViewerMenu, FeatureFlags.VANILLA_SET) } - val CARGO_CRATE: MenuType by registry.register(MNames.CARGO_CRATE) { MenuType(::CargoCrateMenu, FeatureFlags.VANILLA_SET) } - val MINECART_CARGO_CRATE: MenuType by registry.register(MNames.MINECART_CARGO_CRATE) { MenuType(::MinecartCargoCrateMenu, FeatureFlags.VANILLA_SET) } - val DRIVE_RACK: MenuType by registry.register(MNames.DRIVE_RACK) { MenuType(::DriveRackMenu, FeatureFlags.VANILLA_SET) } - val ITEM_MONITOR: MenuType by registry.register(MNames.ITEM_MONITOR) { MenuType(::ItemMonitorMenu, FeatureFlags.VANILLA_SET) } - val ENERGY_COUNTER: MenuType by registry.register(MNames.ENERGY_COUNTER) { MenuType(::EnergyCounterMenu, FeatureFlags.VANILLA_SET) } - val CHEMICAL_GENERATOR: MenuType by registry.register(MNames.CHEMICAL_GENERATOR) { MenuType(::ChemicalGeneratorMenu, FeatureFlags.VANILLA_SET) } - val PLATE_PRESS: MenuType by registry.register(MNames.PLATE_PRESS) { MenuType(::PlatePressMenu, FeatureFlags.VANILLA_SET) } - val POWERED_FURNACE: MenuType by registry.register(MNames.POWERED_FURNACE) { MenuType(PoweredFurnaceMenu::furnace, FeatureFlags.VANILLA_SET) } - val POWERED_BLAST_FURNACE: MenuType by registry.register(MNames.POWERED_BLAST_FURNACE) { MenuType(PoweredFurnaceMenu::blasting, FeatureFlags.VANILLA_SET) } - val POWERED_SMOKER: MenuType by registry.register(MNames.POWERED_SMOKER) { MenuType(PoweredFurnaceMenu::smoking, FeatureFlags.VANILLA_SET) } - val TWIN_PLATE_PRESS: MenuType by registry.register(MNames.TWIN_PLATE_PRESS) { MenuType(::TwinPlatePressMenu, FeatureFlags.VANILLA_SET) } - val MATTER_RECYCLER: MenuType by registry.register(MNames.MATTER_RECYCLER) { MenuType(::MatterRecyclerMenu, FeatureFlags.VANILLA_SET) } - val ENERGY_SERVO: MenuType by registry.register(MNames.ENERGY_SERVO) { MenuType(::EnergyServoMenu, FeatureFlags.VANILLA_SET) } - val HOLO_SIGN: MenuType by registry.register(MNames.HOLO_SIGN) { MenuType(::HoloSignMenu, FeatureFlags.VANILLA_SET) } - val COBBLESTONE_GENERATOR: MenuType by registry.register(MNames.COBBLESTONE_GENERATOR) { MenuType(::CobblerMenu, FeatureFlags.VANILLA_SET) } - val ESSENCE_STORAGE: MenuType by registry.register(MNames.ESSENCE_STORAGE) { MenuType(::EssenceStorageMenu, FeatureFlags.VANILLA_SET) } - val ITEM_REPAIER: MenuType by registry.register(MNames.MATTER_RECONSTRUCTOR) { MenuType(::MatterReconstructorMenu, FeatureFlags.VANILLA_SET) } - val FLUID_TANK: MenuType by registry.register(MNames.FLUID_TANK) { MenuType(::FluidTankMenu, FeatureFlags.VANILLA_SET) } - val PAINTER: MenuType by registry.register(MNames.PAINTER) { MenuType(::PainterMenu, FeatureFlags.VANILLA_SET) } - val MATTER_ENTANGLER: MenuType by registry.register(MNames.MATTER_ENTANGLER) { MenuType(::MatterEntanglerMenu, FeatureFlags.VANILLA_SET) } + val ANDROID_STATION by registry.register(MNames.ANDROID_STATION) { MenuType(::AndroidStationMenu, FeatureFlags.VANILLA_SET) } + val ANDROID_CHARGER by registry.register(MNames.ANDROID_CHARGER) { MenuType({ a, b -> AndroidChargerMenu(a, b, null as AndroidChargerBlockEntity?) }, FeatureFlags.VANILLA_SET) } + val BATTERY_BANK by registry.register(MNames.BATTERY_BANK) { MenuType(::BatteryBankMenu, FeatureFlags.VANILLA_SET) } + val MATTER_DECOMPOSER by registry.register(MNames.MATTER_DECOMPOSER) { MenuType(::MatterDecomposerMenu, FeatureFlags.VANILLA_SET) } + val MATTER_CAPACITOR_BANK by registry.register(MNames.MATTER_CAPACITOR_BANK) { MenuType(::MatterCapacitorBankMenu, FeatureFlags.VANILLA_SET) } + val PATTERN_STORAGE by registry.register(MNames.PATTERN_STORAGE) { MenuType(::PatternStorageMenu, FeatureFlags.VANILLA_SET) } + val MATTER_SCANNER by registry.register(MNames.MATTER_SCANNER) { MenuType(::MatterScannerMenu, FeatureFlags.VANILLA_SET) } + val MATTER_PANEL by registry.register(MNames.MATTER_PANEL) { MenuType(::MatterPanelMenu, FeatureFlags.VANILLA_SET) } + val MATTER_REPLICATOR by registry.register(MNames.MATTER_REPLICATOR) { MenuType(::MatterReplicatorMenu, FeatureFlags.VANILLA_SET) } + val MATTER_BOTTLER by registry.register(MNames.MATTER_BOTTLER) { MenuType(::MatterBottlerMenu, FeatureFlags.VANILLA_SET) } + val DRIVE_VIEWER by registry.register(MNames.DRIVE_VIEWER) { MenuType(::DriveViewerMenu, FeatureFlags.VANILLA_SET) } + val CARGO_CRATE by registry.register(MNames.CARGO_CRATE) { MenuType(::CargoCrateMenu, FeatureFlags.VANILLA_SET) } + val MINECART_CARGO_CRATE by registry.register(MNames.MINECART_CARGO_CRATE) { MenuType(::MinecartCargoCrateMenu, FeatureFlags.VANILLA_SET) } + val DRIVE_RACK by registry.register(MNames.DRIVE_RACK) { MenuType(::DriveRackMenu, FeatureFlags.VANILLA_SET) } + val ITEM_MONITOR by registry.register(MNames.ITEM_MONITOR) { MenuType(::ItemMonitorMenu, FeatureFlags.VANILLA_SET) } + val ENERGY_COUNTER by registry.register(MNames.ENERGY_COUNTER) { MenuType(::EnergyCounterMenu, FeatureFlags.VANILLA_SET) } + val CHEMICAL_GENERATOR by registry.register(MNames.CHEMICAL_GENERATOR) { MenuType(::ChemicalGeneratorMenu, FeatureFlags.VANILLA_SET) } + val PLATE_PRESS by registry.register(MNames.PLATE_PRESS) { MenuType(::PlatePressMenu, FeatureFlags.VANILLA_SET) } + val POWERED_FURNACE by registry.register(MNames.POWERED_FURNACE) { MenuType(PoweredFurnaceMenu::furnace, FeatureFlags.VANILLA_SET) } + val POWERED_BLAST_FURNACE by registry.register(MNames.POWERED_BLAST_FURNACE) { MenuType(PoweredFurnaceMenu::blasting, FeatureFlags.VANILLA_SET) } + val POWERED_SMOKER by registry.register(MNames.POWERED_SMOKER) { MenuType(PoweredFurnaceMenu::smoking, FeatureFlags.VANILLA_SET) } + val TWIN_PLATE_PRESS by registry.register(MNames.TWIN_PLATE_PRESS) { MenuType(::TwinPlatePressMenu, FeatureFlags.VANILLA_SET) } + val MATTER_RECYCLER by registry.register(MNames.MATTER_RECYCLER) { MenuType(::MatterRecyclerMenu, FeatureFlags.VANILLA_SET) } + val ENERGY_SERVO by registry.register(MNames.ENERGY_SERVO) { MenuType(::EnergyServoMenu, FeatureFlags.VANILLA_SET) } + val HOLO_SIGN by registry.register(MNames.HOLO_SIGN) { MenuType(::HoloSignMenu, FeatureFlags.VANILLA_SET) } + val COBBLESTONE_GENERATOR by registry.register(MNames.COBBLESTONE_GENERATOR) { MenuType(::CobblerMenu, FeatureFlags.VANILLA_SET) } + val ESSENCE_STORAGE by registry.register(MNames.ESSENCE_STORAGE) { MenuType(::EssenceStorageMenu, FeatureFlags.VANILLA_SET) } + val ITEM_REPAIER by registry.register(MNames.MATTER_RECONSTRUCTOR) { MenuType(::MatterReconstructorMenu, FeatureFlags.VANILLA_SET) } + val FLUID_TANK by registry.register(MNames.FLUID_TANK) { MenuType(::FluidTankMenu, FeatureFlags.VANILLA_SET) } + val PAINTER by registry.register(MNames.PAINTER) { MenuType(::PainterMenu, FeatureFlags.VANILLA_SET) } + val MATTER_ENTANGLER by registry.register(MNames.MATTER_ENTANGLER) { MenuType(::MatterEntanglerMenu, FeatureFlags.VANILLA_SET) } - val STORAGE_BUS: MenuType by registry.register(MNames.STORAGE_BUS) { MenuType(::StorageBusMenu, FeatureFlags.VANILLA_SET) } - val STORAGE_IMPORTER_EXPORTER: MenuType by registry.register(MNames.STORAGE_IMPORTER) { MenuType(::StorageImporterExporterMenu, FeatureFlags.VANILLA_SET) } - val STORAGE_POWER_SUPPLIER: MenuType by registry.register(MNames.STORAGE_POWER_SUPPLIER) { MenuType(::StoragePowerSupplierMenu, FeatureFlags.VANILLA_SET) } + val STORAGE_BUS by registry.register(MNames.STORAGE_BUS) { MenuType(::StorageBusMenu, FeatureFlags.VANILLA_SET) } + val STORAGE_IMPORTER_EXPORTER by registry.register(MNames.STORAGE_IMPORTER) { MenuType(::StorageImporterExporterMenu, FeatureFlags.VANILLA_SET) } + val STORAGE_POWER_SUPPLIER by registry.register(MNames.STORAGE_POWER_SUPPLIER) { MenuType(::StoragePowerSupplierMenu, FeatureFlags.VANILLA_SET) } internal fun register(bus: IEventBus) { registry.register(bus) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRecipes.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRecipes.kt index db9109e31..48568dbf5 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRecipes.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRecipes.kt @@ -20,15 +20,15 @@ object MRecipes { } } - private val types = DeferredRegister.create(ForgeRegistries.RECIPE_TYPES, OverdriveThatMatters.MOD_ID) - private val serializers = DeferredRegister.create(ForgeRegistries.RECIPE_SERIALIZERS, OverdriveThatMatters.MOD_ID) + private val types = MDeferredRegister(ForgeRegistries.RECIPE_TYPES, OverdriveThatMatters.MOD_ID) + private val serializers = MDeferredRegister(ForgeRegistries.RECIPE_SERIALIZERS, OverdriveThatMatters.MOD_ID) internal fun register(bus: IEventBus) { types.register(bus) serializers.register(bus) } - private fun > register(name: String): RegistryObject> { + private fun > register(name: String): MDeferredRegister<*>.Entry> { return types.register(name) { Type(name) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt index dacee4476..a5ff63f79 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt @@ -114,11 +114,11 @@ object MRegistry : IBlockItemRegistryAcceptor { private val decorativeBlocks = ArrayList() - override fun registerItems(registry: DeferredRegister) { + override fun registerItems(registry: MDeferredRegister) { decorativeBlocks.forEach { it.registerItems(registry) } } - override fun registerBlocks(registry: DeferredRegister) { + override fun registerBlocks(registry: MDeferredRegister) { decorativeBlocks.forEach { it.registerBlocks(registry) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MSoundEvents.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MSoundEvents.kt index d1c3d73b7..56946d77c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MSoundEvents.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MSoundEvents.kt @@ -11,19 +11,19 @@ import net.minecraftforge.registries.ForgeRegistries import ru.dbotthepony.mc.otm.OverdriveThatMatters object MSoundEvents { - private val registry: DeferredRegister = DeferredRegister.create(ForgeRegistries.SOUND_EVENTS, OverdriveThatMatters.MOD_ID) + private val registry: MDeferredRegister = MDeferredRegister(ForgeRegistries.SOUND_EVENTS, OverdriveThatMatters.MOD_ID) // TODO: 1.19.3 - private fun make(name: String) = registry.register(name) { SoundEvent.createVariableRangeEvent(ResourceLocation(OverdriveThatMatters.MOD_ID, name)) } + private fun make(name: String): MDeferredRegister.Entry = registry.register(name) { SoundEvent.createVariableRangeEvent(ResourceLocation(OverdriveThatMatters.MOD_ID, name)) } - val RIFLE_SHOT: SoundEvent by make("item.rifle_shot") - val PLASMA_WEAPON_OVERHEAT: SoundEvent by make("item.plasma_weapon_overheat") - val PLAYER_BECOME_ANDROID: SoundEvent by make("player_become_android") - val CARGO_CRATE_OPEN: SoundEvent by make("cargo_crate_open") + val RIFLE_SHOT by make("item.rifle_shot") + val PLASMA_WEAPON_OVERHEAT by make("item.plasma_weapon_overheat") + val PLAYER_BECOME_ANDROID by make("player_become_android") + val CARGO_CRATE_OPEN by make("cargo_crate_open") - val ANDROID_JUMP_BOOST: SoundEvent by make("android.jump_boost") - val ANDROID_SHOCKWAVE: SoundEvent by make("android.shockwave") - val ANDROID_PROJ_PARRY: SoundEvent by make("android.projectile_parry") + val ANDROID_JUMP_BOOST by make("android.jump_boost") + val ANDROID_SHOCKWAVE by make("android.shockwave") + val ANDROID_PROJ_PARRY by make("android.projectile_parry") internal fun register(bus: IEventBus) { registry.register(bus) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/objects/ColoredDecorativeBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/objects/ColoredDecorativeBlock.kt index a591fb49c..4416da20d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/objects/ColoredDecorativeBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/objects/ColoredDecorativeBlock.kt @@ -8,8 +8,10 @@ import net.minecraft.world.level.block.state.BlockBehaviour import net.minecraftforge.registries.DeferredRegister import net.minecraftforge.registries.RegistryObject import ru.dbotthepony.mc.otm.core.collect.SupplierMap +import ru.dbotthepony.mc.otm.registry.MDeferredRegister import ru.dbotthepony.mc.otm.registry.MRegistry import java.util.EnumMap +import java.util.function.Supplier /** * Colored only @@ -25,8 +27,8 @@ open class ColoredDecorativeBlock( var registeredBlocks = false private set - protected val itemMap = EnumMap>(DyeColor::class.java) - protected val blockMap = EnumMap>(DyeColor::class.java) + protected val itemMap = EnumMap>(DyeColor::class.java) + protected val blockMap = EnumMap>(DyeColor::class.java) fun forEachItem(consumer: (String, DyeColor, Item) -> Unit) { MRegistry.DYE_ORDER.forEach { @@ -60,7 +62,7 @@ open class ColoredDecorativeBlock( SupplierMap(MRegistry.DYE_ORDER.map { it to itemMap[it]!! }) } - override fun registerBlocks(registry: DeferredRegister) { + override fun registerBlocks(registry: MDeferredRegister) { check(blockMap.isEmpty()) { "( ͡° ͜ʖ ͡°) No. \\(• ε •)/ ( ͠° ل͜ ͡°) ( ͠° ͟ ͟ʖ ͡°) (ง ͠° ͟ل͜ ͡°)ง ( ͡°︺͡°) ('ω')" } MRegistry.DYE_ORDER.forEach { @@ -72,7 +74,7 @@ open class ColoredDecorativeBlock( private val properties = Item.Properties().stacksTo(64) - override fun registerItems(registry: DeferredRegister) { + override fun registerItems(registry: MDeferredRegister) { check(itemMap.isEmpty()) { "( ͡° ͜ʖ ͡°) No. \\(• ε •)/ ( ͠° ل͜ ͡°) ( ͠° ͟ ͟ʖ ͡°) (ง ͠° ͟ل͜ ͡°)ง ( ͡°︺͡°) ('ω')" } check(registeredBlocks) { "wtffffff???????????" } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/objects/DecorativeBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/objects/DecorativeBlock.kt index 03a4dae6d..d9912d3d4 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/objects/DecorativeBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/objects/DecorativeBlock.kt @@ -11,17 +11,16 @@ import net.minecraft.world.level.block.state.BlockBehaviour import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.phys.shapes.CollisionContext import net.minecraft.world.phys.shapes.VoxelShape -import net.minecraftforge.registries.DeferredRegister -import net.minecraftforge.registries.RegistryObject import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock import ru.dbotthepony.mc.otm.block.getShapeForEachState import ru.dbotthepony.mc.otm.core.collect.SupplierMap import ru.dbotthepony.mc.otm.core.get import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom import ru.dbotthepony.mc.otm.core.util.WriteOnce +import ru.dbotthepony.mc.otm.registry.MDeferredRegister import ru.dbotthepony.mc.otm.registry.MRegistry import ru.dbotthepony.mc.otm.shapes.BlockShape -import ru.dbotthepony.mc.otm.shapes.BlockShapes +import java.util.function.Supplier import java.util.stream.Stream /** @@ -31,8 +30,8 @@ class DecorativeBlock( baseName: String, private val provider: (DyeColor?) -> Block, ) : ColoredDecorativeBlock(baseName, provider) { - private var _block: RegistryObject by WriteOnce() - private var _item: RegistryObject by WriteOnce() + private var _block: Supplier by WriteOnce() + private var _item: Supplier by WriteOnce() val block: Block get() = _block.get() val item: Item get() = _item.get() @@ -47,12 +46,12 @@ class DecorativeBlock( SupplierMap(Streams.concat(MRegistry.DYE_ORDER.stream().map { it to itemMap[it]!! }, Stream.of(null to _item))) } - override fun registerBlocks(registry: DeferredRegister) { + override fun registerBlocks(registry: MDeferredRegister) { _block = registry.register(baseName) { provider.invoke(null) } super.registerBlocks(registry) } - override fun registerItems(registry: DeferredRegister) { + override fun registerItems(registry: MDeferredRegister) { _item = registry.register(baseName) { BlockItem(_block.get(), Item.Properties().stacksTo(64)) } super.registerItems(registry) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/objects/IBlockItemRegistryAcceptor.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/objects/IBlockItemRegistryAcceptor.kt index 5104597eb..70cf227d0 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/objects/IBlockItemRegistryAcceptor.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/objects/IBlockItemRegistryAcceptor.kt @@ -2,9 +2,9 @@ package ru.dbotthepony.mc.otm.registry.objects import net.minecraft.world.item.Item import net.minecraft.world.level.block.Block -import net.minecraftforge.registries.DeferredRegister +import ru.dbotthepony.mc.otm.registry.MDeferredRegister interface IBlockItemRegistryAcceptor { - fun registerItems(registry: DeferredRegister) - fun registerBlocks(registry: DeferredRegister) + fun registerItems(registry: MDeferredRegister) + fun registerBlocks(registry: MDeferredRegister) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/objects/StripedColoredDecorativeBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/objects/StripedColoredDecorativeBlock.kt index 222bd7e31..c0a68796d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/objects/StripedColoredDecorativeBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/objects/StripedColoredDecorativeBlock.kt @@ -10,6 +10,7 @@ import net.minecraftforge.registries.DeferredRegister import net.minecraftforge.registries.RegistryObject import ru.dbotthepony.mc.otm.core.collect.SupplierList import ru.dbotthepony.mc.otm.core.collect.SupplierMap +import ru.dbotthepony.mc.otm.registry.MDeferredRegister import java.util.EnumMap import java.util.function.Supplier @@ -21,8 +22,8 @@ class StripedColoredDecorativeBlock( BlockItem(block, Item.Properties().stacksTo(64)) } ) : IBlockItemRegistryAcceptor { - private val mapBlocks = EnumMap>>(DyeColor::class.java) - private val mapItems = EnumMap>>(DyeColor::class.java) + private val mapBlocks = EnumMap>>(DyeColor::class.java) + private val mapItems = EnumMap>>(DyeColor::class.java) fun getBlockNullable(base: DyeColor, stripe: DyeColor): Block? { check(registeredBlocks) { "Didn't register items yet" } @@ -82,7 +83,7 @@ class StripedColoredDecorativeBlock( SupplierList(mapBlocks.flatMap { it.value.values }) } - override fun registerItems(registry: DeferredRegister) { + override fun registerItems(registry: MDeferredRegister) { for (base in DyeColor.entries) { for (stripe in DyeColor.entries) { if (base == stripe) { @@ -97,7 +98,7 @@ class StripedColoredDecorativeBlock( registeredItems = true } - override fun registerBlocks(registry: DeferredRegister) { + override fun registerBlocks(registry: MDeferredRegister) { for (base in DyeColor.entries) { for (stripe in DyeColor.entries) { if (base == stripe) {