From 8a3ef344e3cda95d4a3d66d2391496ae3370a0a6 Mon Sep 17 00:00:00 2001 From: YuRaNnNzZZ Date: Sun, 21 Jan 2024 13:14:42 +0300 Subject: [PATCH] essence storage empty/filled blockstate --- .../mc/otm/datagen/blocks/BlockModels.kt | 4 +- .../mc/otm/datagen/blocks/BlockStates.kt | 18 ++- .../mc/otm/datagen/items/ItemModels.kt | 14 +- .../entity/tech/EssenceStorageBlockEntity.kt | 19 +++ .../mc/otm/block/tech/EssenceStorageBlock.kt | 14 ++ .../dbotthepony/mc/otm/registry/MRegistry.kt | 14 ++ .../models/block/essence_storage_empty.json | 124 ++++++++++++++++++ ...orage.json => essence_storage_filled.json} | 51 ++----- 8 files changed, 215 insertions(+), 43 deletions(-) create mode 100644 src/main/resources/assets/overdrive_that_matters/models/block/essence_storage_empty.json rename src/main/resources/assets/overdrive_that_matters/models/block/{essence_storage.json => essence_storage_filled.json} (76%) 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 884505d6c..a6b3eb704 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 @@ -17,11 +17,13 @@ fun addBlockModels(provider: MatteryBlockModelProvider) { cable("storage_cable", "block/storage_cable") colored(MBlocks.COBBLESTONE_GENERATOR, listOf("0", "particle")) - colored(MBlocks.ESSENCE_STORAGE, listOf("0", "particle")) colored(MBlocks.ITEM_MONITOR, listOf("0", "particle")) colored(MBlocks.MATTER_RECONSTRUCTOR, listOf("0", "particle")) colored(MBlocks.ENERGY_SERVO, listOf("0", "particle")) + colored("essence_storage", "_empty", listOf("0")) + colored("essence_storage", "_filled", listOf("0")) + colored("matter_capacitor_bank", listOf("1", "particle"), "mattercapacitorbank_frame") colored("battery_bank", listOf("0", "particle"), "batterybank_frame") 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 cd07f3fde..68846f7b9 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 @@ -8,6 +8,7 @@ import ru.dbotthepony.mc.otm.block.decorative.CargoCrateBlock import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.block.matter.MatterBottlerBlock import ru.dbotthepony.mc.otm.block.tech.AndroidChargerBlock +import ru.dbotthepony.mc.otm.block.tech.EssenceStorageBlock import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom import ru.dbotthepony.mc.otm.core.math.xRotationBlockstateNorth import ru.dbotthepony.mc.otm.core.math.xRotationBlockstateSouth @@ -112,7 +113,22 @@ fun addBlockStates(provider: MatteryBlockStateProvider) { provider.block(MBlocks.MATTER_RECONSTRUCTOR.values) provider.block(MBlocks.ENERGY_SERVO.values) provider.block(MBlocks.COBBLESTONE_GENERATOR.values) - provider.block(MBlocks.ESSENCE_STORAGE.values) + + provider.exec { + for (block in MBlocks.ESSENCE_STORAGE.values) { + provider.getVariantBuilder(block).forAllStates { + return@forAllStates arrayOf( + ConfiguredModel.builder() + .modelFile(provider.models().getExistingFile( + modLocation("${block.registryName!!.path}_${if (it.getValue( + EssenceStorageBlock.FILLED)) "filled" else "empty"}") + )) + .rotationY(it.getValue(BlockRotationFreedom.HORIZONTAL.property).front.yRotationBlockstateNorth()) + .buildLast() + ) + } + } + } provider.exec { for (crate in MRegistry.CARGO_CRATES.allBlocks.values) { 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 2d3244968..daadb672c 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 @@ -174,7 +174,6 @@ fun addItemModels(provider: MatteryItemModelProvider) { provider.coloredWithBaseBlock(MItems.DRIVE_VIEWER, "drive_viewer", "_idle") provider.coloredWithBaseBlock(MItems.MATTER_DECOMPOSER, "matter_decomposer", "_idle") provider.coloredWithBaseBlock(MItems.ENERGY_SERVO, "energy_servo") - provider.coloredWithBaseBlock(MItems.ESSENCE_STORAGE, "essence_storage") provider.coloredWithBaseBlock(MItems.MATTER_RECONSTRUCTOR, "matter_reconstructor") provider.coloredWithBaseBlock(MItems.POWERED_BLAST_FURNACE, "powered_blast_furnace", "_idle") @@ -187,10 +186,23 @@ fun addItemModels(provider: MatteryItemModelProvider) { provider.coloredWithBaseBlock(MItems.MATTER_RECYCLER, "matter_recycler", "_idle") provider.coloredWithBaseBlock(MItems.COBBLESTONE_GENERATOR, "cobblestone_generator") + provider.exec { + provider.withExistingParent("essence_storage", modLocation("block/essence_storage_empty")) + .override() + .predicate(modLocation("is_filled"), 1f) + .model(provider.withExistingParent("essence_storage_filled", modLocation("block/essence_storage_filled"))) + .end() + } + 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.withExistingParent("essence_storage_${dye.name.lowercase()}", modLocation("block/essence_storage_${dye.name.lowercase()}_empty")) + .override() + .predicate(modLocation("is_filled"), 1f) + .model(provider.withExistingParent("essence_storage_${dye.name.lowercase()}_filled", modLocation("block/essence_storage_${dye.name.lowercase()}_filled"))) + .end() } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/EssenceStorageBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/EssenceStorageBlockEntity.kt index 09b936abb..80c28c98e 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/EssenceStorageBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/EssenceStorageBlockEntity.kt @@ -10,17 +10,20 @@ import net.minecraft.world.entity.player.Player import net.minecraft.world.inventory.AbstractContainerMenu import net.minecraft.world.item.ItemStack import net.minecraft.world.item.enchantment.Enchantments +import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.state.BlockState import net.minecraftforge.fluids.FluidStack import net.minecraftforge.fluids.capability.IFluidHandler import ru.dbotthepony.mc.otm.block.entity.ExperienceStorage.Companion.XP_TO_LIQUID_RATIO import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity +import ru.dbotthepony.mc.otm.block.tech.EssenceStorageBlock import ru.dbotthepony.mc.otm.capability.item.CombinedItemHandler import ru.dbotthepony.mc.otm.config.MachinesConfig import ru.dbotthepony.mc.otm.container.HandlerFilter import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.core.getEntitiesInEllipsoid import ru.dbotthepony.mc.otm.core.math.Vector +import ru.dbotthepony.mc.otm.core.util.countingLazy import ru.dbotthepony.mc.otm.item.EssenceCapsuleItem import ru.dbotthepony.mc.otm.item.EssenceServoItem import ru.dbotthepony.mc.otm.menu.tech.EssenceStorageMenu @@ -127,6 +130,14 @@ class EssenceStorageBlockEntity(blockPos: BlockPos, blockState: BlockState) : Ma return FluidStack(MFluids.LIQUID_XP, actualDrain) } + private val hasFillState by countingLazy(blockStateChangesCounter) { + this.blockState.hasProperty(EssenceStorageBlock.FILLED) + } + + private val isFilledState by countingLazy(blockStateChangesCounter) { + hasFillState && this.blockState.getValue(EssenceStorageBlock.FILLED) + } + override fun tick() { super.tick() @@ -186,5 +197,13 @@ class EssenceStorageBlockEntity(blockPos: BlockPos, blockState: BlockState) : Ma } } } + + if (hasFillState) { + val filled = experienceStored > 0 + + if (isFilledState != filled) { + level?.setBlock(blockPos, blockState.setValue(EssenceStorageBlock.FILLED, filled), Block.UPDATE_CLIENTS) + } + } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/tech/EssenceStorageBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/tech/EssenceStorageBlock.kt index c87982755..1628451d7 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/tech/EssenceStorageBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/tech/EssenceStorageBlock.kt @@ -9,11 +9,14 @@ import net.minecraft.world.entity.player.Player import net.minecraft.world.item.DyeColor import net.minecraft.world.level.BlockGetter import net.minecraft.world.level.Level +import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.EntityBlock import net.minecraft.world.level.block.entity.BlockEntity import net.minecraft.world.level.block.entity.BlockEntityTicker import net.minecraft.world.level.block.entity.BlockEntityType import net.minecraft.world.level.block.state.BlockState +import net.minecraft.world.level.block.state.StateDefinition +import net.minecraft.world.level.block.state.properties.BooleanProperty import net.minecraft.world.level.material.MapColor import net.minecraft.world.level.material.PushReaction import net.minecraft.world.phys.BlockHitResult @@ -44,6 +47,8 @@ class EssenceStorageBlock(val color: DyeColor?) : RotatableMatteryBlock(Properti acceptor(TranslatableComponent("otm.gui.experience_levels", getLevelFromXp(l.asLong)).withStyle(ChatFormatting.GRAY)) } } + + registerDefaultState(getStateDefinition().any().setValue(FILLED, false)) } override fun newBlockEntity(pPos: BlockPos, pState: BlockState): BlockEntity { @@ -67,6 +72,11 @@ class EssenceStorageBlock(val color: DyeColor?) : RotatableMatteryBlock(Properti return super.use(blockState, level, blockPos, ply, hand, blockHitResult) } + override fun createBlockStateDefinition(builder: StateDefinition.Builder) { + super.createBlockStateDefinition(builder) + builder.add(FILLED) + } + private val shapes = getShapeForEachState(rotationProperty) { BlockShapes.ESSENCE_STORAGE.rotateFromNorth(it[rotationProperty]).computeShape() } @Suppress("override_deprecation") @@ -78,4 +88,8 @@ class EssenceStorageBlock(val color: DyeColor?) : RotatableMatteryBlock(Properti ): VoxelShape { return shapes[state]!! } + + companion object { + val FILLED = BooleanProperty.create("filled") + } } 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 e53a262a6..417aae832 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt @@ -8,10 +8,12 @@ import net.minecraft.client.renderer.item.ItemProperties import net.minecraft.core.BlockPos import net.minecraft.core.cauldron.CauldronInteraction import net.minecraft.core.registries.Registries +import net.minecraft.nbt.CompoundTag import net.minecraft.resources.ResourceLocation import net.minecraft.world.entity.EntityType import net.minecraft.world.entity.ai.village.poi.PoiType import net.minecraft.world.entity.ai.village.poi.PoiTypes +import net.minecraft.world.item.BlockItem import net.minecraft.world.item.DyeColor import net.minecraft.world.item.DyeableArmorItem import net.minecraft.world.item.Item @@ -389,6 +391,18 @@ object MRegistry : IBlockItemRegistryAcceptor { } } } + + for (item in MItems.ESSENCE_STORAGE.values) { + ItemProperties.register(item, ResourceLocation(OverdriveThatMatters.MOD_ID, "is_filled")) { stack, _, _, _ -> + val tag = (stack.tag?.get(BlockItem.BLOCK_ENTITY_TAG) as? CompoundTag)?: return@register 0f + + if (tag.contains("experienceStored") && tag.getLong("experienceStored") > 0.0) { + 1f + } else { + 0f + } + } + } } } diff --git a/src/main/resources/assets/overdrive_that_matters/models/block/essence_storage_empty.json b/src/main/resources/assets/overdrive_that_matters/models/block/essence_storage_empty.json new file mode 100644 index 000000000..edbee1f08 --- /dev/null +++ b/src/main/resources/assets/overdrive_that_matters/models/block/essence_storage_empty.json @@ -0,0 +1,124 @@ +{ + "parent": "block/block", + "credit": "Made with Blockbench", + "render_type": "cutout", + "texture_size": [32, 64], + "textures": { + "0": "overdrive_that_matters:block/essence_storage", + "particle": "#0" + }, + "elements": [ + { + "name": "body", + "from": [0, 0, 0], + "to": [16, 2, 16], + "faces": { + "north": {"uv": [0, 4, 8, 4.5], "texture": "#0"}, + "east": {"uv": [0, 4, 8, 4.5], "texture": "#0"}, + "south": {"uv": [0, 4, 8, 4.5], "texture": "#0"}, + "west": {"uv": [0, 4, 8, 4.5], "texture": "#0"}, + "up": {"uv": [0, 0, 8, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 8, 4], "texture": "#0"} + } + }, + { + "name": "body", + "from": [0, 3, 0], + "to": [16, 5, 16], + "faces": { + "north": {"uv": [8, 7.25, 16, 7.75], "texture": "#0"}, + "east": {"uv": [8, 7.25, 16, 7.75], "texture": "#0"}, + "south": {"uv": [8, 7.25, 16, 7.75], "texture": "#0"}, + "west": {"uv": [8, 7.25, 16, 7.75], "texture": "#0"}, + "up": {"uv": [0, 7.25, 8, 11.25], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 0, 8, 4], "texture": "#0"} + } + }, + { + "name": "body", + "from": [9, 5, 0], + "to": [16, 16, 14], + "faces": { + "north": {"uv": [12, 0, 15.5, 2.75], "texture": "#0"}, + "east": {"uv": [9, 7.75, 16, 10.5], "texture": "#0"}, + "south": {"uv": [11, 4.5, 14.5, 7.25], "texture": "#0"}, + "west": {"uv": [0, 4.5, 7, 7.25], "texture": "#0"}, + "up": {"uv": [0, 7.75, 3.5, 11.25], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "body", + "from": [0, 10, 14], + "to": [16, 16, 16], + "faces": { + "east": {"uv": [8, 7.75, 9, 9.25], "texture": "#0"}, + "south": {"uv": [0, 11.25, 8, 12.75], "texture": "#0"}, + "west": {"uv": [14.5, 4.5, 15.5, 6], "texture": "#0"}, + "up": {"uv": [0, 7.25, 8, 7.75], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 7.25, 8, 7.75], "texture": "#0"} + } + }, + { + "name": "body", + "from": [0, 5, 9], + "to": [9, 16, 14], + "faces": { + "north": {"uv": [7, 4.5, 11.5, 7.25], "texture": "#0"}, + "south": {"uv": [5, 4.5, 9.5, 7.25], "texture": "#0"}, + "west": {"uv": [12, 4.5, 14.5, 7.25], "texture": "#0"}, + "up": {"uv": [3.5, 7.75, 8, 9], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "body", + "from": [1, 2, 1], + "to": [15, 3, 15], + "faces": { + "north": {"uv": [0.5, 4.25, 7.5, 4.5], "texture": "#0"}, + "east": {"uv": [0.5, 4.25, 7.5, 4.5], "texture": "#0"}, + "south": {"uv": [0.5, 4.25, 7.5, 4.5], "texture": "#0"}, + "west": {"uv": [0.5, 4.25, 7.5, 4.5], "texture": "#0"} + } + }, + { + "name": "body", + "from": [1, 5, 14], + "to": [15, 10, 15], + "faces": { + "east": {"uv": [15.5, 10.5, 16, 11.75], "texture": "#0"}, + "south": {"uv": [8.5, 10.5, 15.5, 11.75], "texture": "#0"}, + "west": {"uv": [8, 10.5, 8.5, 11.75], "texture": "#0"} + } + }, + { + "name": "bottle", + "from": [1, 13, 1], + "to": [9, 15, 9], + "faces": { + "north": {"uv": [8, 2, 12, 2.5], "texture": "#0"}, + "west": {"uv": [8, 2, 12, 2.5], "texture": "#0"}, + "up": {"uv": [8, 0, 12, 2], "texture": "#0"}, + "down": {"uv": [8, 0, 12, 2], "texture": "#0"} + } + }, + { + "name": "bottle", + "from": [1, 5, 1], + "to": [9, 6, 9], + "faces": { + "north": {"uv": [8, 4.25, 12, 4.5], "texture": "#0"}, + "west": {"uv": [8, 4.25, 12, 4.5], "texture": "#0"}, + "up": {"uv": [8, 0, 12, 2], "texture": "#0"} + } + }, + { + "name": "bottle", + "from": [1, 6, 1], + "to": [9, 13, 9], + "faces": { + "north": {"uv": [8, 2.5, 12, 4.25], "texture": "#0"}, + "west": {"uv": [8, 2.5, 12, 4.25], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/overdrive_that_matters/models/block/essence_storage.json b/src/main/resources/assets/overdrive_that_matters/models/block/essence_storage_filled.json similarity index 76% rename from src/main/resources/assets/overdrive_that_matters/models/block/essence_storage.json rename to src/main/resources/assets/overdrive_that_matters/models/block/essence_storage_filled.json index b8cd1d055..f9420d560 100644 --- a/src/main/resources/assets/overdrive_that_matters/models/block/essence_storage.json +++ b/src/main/resources/assets/overdrive_that_matters/models/block/essence_storage_filled.json @@ -1,10 +1,12 @@ { + "parent": "block/block", "credit": "Made with Blockbench", "render_type": "cutout", "texture_size": [32, 64], "textures": { "0": "overdrive_that_matters:block/essence_storage", - "particle": "overdrive_that_matters:block/essence_storage" + "1": "overdrive_that_matters:block/liquid_xp_still", + "particle": "#0" }, "elements": [ { @@ -92,15 +94,15 @@ { "name": "experience", "from": [1.5, 5, 1.5], - "to": [8.5, 11, 8.5], + "to": [8.5, 13, 8.5], "faces": { - "north": {"uv": [8, 14.5, 11.5, 16], "texture": "#0"}, - "east": {"uv": [12.5, 12, 16, 13.5], "texture": "#0"}, - "south": {"uv": [9, 12, 12.5, 13.5], "texture": "#0"}, - "west": {"uv": [11.5, 14.5, 15, 16], "texture": "#0"}, - "up": {"uv": [9.5, 12.5, 13, 14.25], "texture": "#0"} + "north": {"uv": [7.5, 3, 14.5, 11], "texture": "#1"}, + "west": {"uv": [1.5, 3, 8.5, 11], "texture": "#1"} }, - "forge_data": { "block_light": 15, "sky_light": 15 } + "forge_data": { + "block_light": 15, + "sky_light": 15 + } }, { "name": "bottle", @@ -132,36 +134,5 @@ "west": {"uv": [8, 2.5, 12, 4.25], "texture": "#0"} } } - ], - "display": { - "thirdperson_righthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 45, 0], - "scale": [0.4, 0.4, 0.4] - }, - "firstperson_lefthand": { - "rotation": [0, 225, 0], - "scale": [0.4, 0.4, 0.4] - }, - "ground": { - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "gui": { - "rotation": [30, 225, 0], - "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "scale": [0.5, 0.5, 0.5] - } - } + ] } \ No newline at end of file