essence storage empty/filled blockstate

This commit is contained in:
YuRaNnNzZZ 2024-01-21 13:14:42 +03:00
parent 7c794126b6
commit 8a3ef344e3
Signed by: YuRaNnNzZZ
GPG Key ID: 5F71738C85A6006D
8 changed files with 215 additions and 43 deletions

View File

@ -17,11 +17,13 @@ fun addBlockModels(provider: MatteryBlockModelProvider) {
cable("storage_cable", "block/storage_cable") cable("storage_cable", "block/storage_cable")
colored(MBlocks.COBBLESTONE_GENERATOR, listOf("0", "particle")) colored(MBlocks.COBBLESTONE_GENERATOR, listOf("0", "particle"))
colored(MBlocks.ESSENCE_STORAGE, listOf("0", "particle"))
colored(MBlocks.ITEM_MONITOR, listOf("0", "particle")) colored(MBlocks.ITEM_MONITOR, listOf("0", "particle"))
colored(MBlocks.MATTER_RECONSTRUCTOR, listOf("0", "particle")) colored(MBlocks.MATTER_RECONSTRUCTOR, listOf("0", "particle"))
colored(MBlocks.ENERGY_SERVO, 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("matter_capacitor_bank", listOf("1", "particle"), "mattercapacitorbank_frame")
colored("battery_bank", listOf("0", "particle"), "batterybank_frame") colored("battery_bank", listOf("0", "particle"), "batterybank_frame")

View File

@ -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.entity.WorkerState
import ru.dbotthepony.mc.otm.block.matter.MatterBottlerBlock import ru.dbotthepony.mc.otm.block.matter.MatterBottlerBlock
import ru.dbotthepony.mc.otm.block.tech.AndroidChargerBlock 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.BlockRotationFreedom
import ru.dbotthepony.mc.otm.core.math.xRotationBlockstateNorth import ru.dbotthepony.mc.otm.core.math.xRotationBlockstateNorth
import ru.dbotthepony.mc.otm.core.math.xRotationBlockstateSouth 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.MATTER_RECONSTRUCTOR.values)
provider.block(MBlocks.ENERGY_SERVO.values) provider.block(MBlocks.ENERGY_SERVO.values)
provider.block(MBlocks.COBBLESTONE_GENERATOR.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 { provider.exec {
for (crate in MRegistry.CARGO_CRATES.allBlocks.values) { for (crate in MRegistry.CARGO_CRATES.allBlocks.values) {

View File

@ -174,7 +174,6 @@ fun addItemModels(provider: MatteryItemModelProvider) {
provider.coloredWithBaseBlock(MItems.DRIVE_VIEWER, "drive_viewer", "_idle") provider.coloredWithBaseBlock(MItems.DRIVE_VIEWER, "drive_viewer", "_idle")
provider.coloredWithBaseBlock(MItems.MATTER_DECOMPOSER, "matter_decomposer", "_idle") provider.coloredWithBaseBlock(MItems.MATTER_DECOMPOSER, "matter_decomposer", "_idle")
provider.coloredWithBaseBlock(MItems.ENERGY_SERVO, "energy_servo") provider.coloredWithBaseBlock(MItems.ENERGY_SERVO, "energy_servo")
provider.coloredWithBaseBlock(MItems.ESSENCE_STORAGE, "essence_storage")
provider.coloredWithBaseBlock(MItems.MATTER_RECONSTRUCTOR, "matter_reconstructor") provider.coloredWithBaseBlock(MItems.MATTER_RECONSTRUCTOR, "matter_reconstructor")
provider.coloredWithBaseBlock(MItems.POWERED_BLAST_FURNACE, "powered_blast_furnace", "_idle") 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.MATTER_RECYCLER, "matter_recycler", "_idle")
provider.coloredWithBaseBlock(MItems.COBBLESTONE_GENERATOR, "cobblestone_generator") 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) { for (dye in DyeColor.entries) {
provider.exec { provider.exec {
provider.withExistingParent("android_charger_${dye.name.lowercase()}", modLocation("item/android_charger")).texture("0", modLocation("block/android_charger/${dye.name.lowercase()}")) 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("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()
} }
} }

View File

@ -10,17 +10,20 @@ import net.minecraft.world.entity.player.Player
import net.minecraft.world.inventory.AbstractContainerMenu import net.minecraft.world.inventory.AbstractContainerMenu
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.enchantment.Enchantments import net.minecraft.world.item.enchantment.Enchantments
import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.level.block.state.BlockState
import net.minecraftforge.fluids.FluidStack import net.minecraftforge.fluids.FluidStack
import net.minecraftforge.fluids.capability.IFluidHandler 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.ExperienceStorage.Companion.XP_TO_LIQUID_RATIO
import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity 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.capability.item.CombinedItemHandler
import ru.dbotthepony.mc.otm.config.MachinesConfig import ru.dbotthepony.mc.otm.config.MachinesConfig
import ru.dbotthepony.mc.otm.container.HandlerFilter import ru.dbotthepony.mc.otm.container.HandlerFilter
import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.container.MatteryContainer
import ru.dbotthepony.mc.otm.core.getEntitiesInEllipsoid import ru.dbotthepony.mc.otm.core.getEntitiesInEllipsoid
import ru.dbotthepony.mc.otm.core.math.Vector 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.EssenceCapsuleItem
import ru.dbotthepony.mc.otm.item.EssenceServoItem import ru.dbotthepony.mc.otm.item.EssenceServoItem
import ru.dbotthepony.mc.otm.menu.tech.EssenceStorageMenu 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) 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() { override fun tick() {
super.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)
}
}
} }
} }

View File

@ -9,11 +9,14 @@ import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.DyeColor import net.minecraft.world.item.DyeColor
import net.minecraft.world.level.BlockGetter import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.Level 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.EntityBlock
import net.minecraft.world.level.block.entity.BlockEntity import net.minecraft.world.level.block.entity.BlockEntity
import net.minecraft.world.level.block.entity.BlockEntityTicker import net.minecraft.world.level.block.entity.BlockEntityTicker
import net.minecraft.world.level.block.entity.BlockEntityType import net.minecraft.world.level.block.entity.BlockEntityType
import net.minecraft.world.level.block.state.BlockState 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.MapColor
import net.minecraft.world.level.material.PushReaction import net.minecraft.world.level.material.PushReaction
import net.minecraft.world.phys.BlockHitResult 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)) 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 { 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) return super.use(blockState, level, blockPos, ply, hand, blockHitResult)
} }
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
super.createBlockStateDefinition(builder)
builder.add(FILLED)
}
private val shapes = getShapeForEachState(rotationProperty) { BlockShapes.ESSENCE_STORAGE.rotateFromNorth(it[rotationProperty]).computeShape() } private val shapes = getShapeForEachState(rotationProperty) { BlockShapes.ESSENCE_STORAGE.rotateFromNorth(it[rotationProperty]).computeShape() }
@Suppress("override_deprecation") @Suppress("override_deprecation")
@ -78,4 +88,8 @@ class EssenceStorageBlock(val color: DyeColor?) : RotatableMatteryBlock(Properti
): VoxelShape { ): VoxelShape {
return shapes[state]!! return shapes[state]!!
} }
companion object {
val FILLED = BooleanProperty.create("filled")
}
} }

View File

@ -8,10 +8,12 @@ import net.minecraft.client.renderer.item.ItemProperties
import net.minecraft.core.BlockPos import net.minecraft.core.BlockPos
import net.minecraft.core.cauldron.CauldronInteraction import net.minecraft.core.cauldron.CauldronInteraction
import net.minecraft.core.registries.Registries import net.minecraft.core.registries.Registries
import net.minecraft.nbt.CompoundTag
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.world.entity.EntityType import net.minecraft.world.entity.EntityType
import net.minecraft.world.entity.ai.village.poi.PoiType import net.minecraft.world.entity.ai.village.poi.PoiType
import net.minecraft.world.entity.ai.village.poi.PoiTypes 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.DyeColor
import net.minecraft.world.item.DyeableArmorItem import net.minecraft.world.item.DyeableArmorItem
import net.minecraft.world.item.Item 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
}
}
}
} }
} }

View File

@ -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"}
}
}
]
}

View File

@ -1,10 +1,12 @@
{ {
"parent": "block/block",
"credit": "Made with Blockbench", "credit": "Made with Blockbench",
"render_type": "cutout", "render_type": "cutout",
"texture_size": [32, 64], "texture_size": [32, 64],
"textures": { "textures": {
"0": "overdrive_that_matters:block/essence_storage", "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": [ "elements": [
{ {
@ -92,15 +94,15 @@
{ {
"name": "experience", "name": "experience",
"from": [1.5, 5, 1.5], "from": [1.5, 5, 1.5],
"to": [8.5, 11, 8.5], "to": [8.5, 13, 8.5],
"faces": { "faces": {
"north": {"uv": [8, 14.5, 11.5, 16], "texture": "#0"}, "north": {"uv": [7.5, 3, 14.5, 11], "texture": "#1"},
"east": {"uv": [12.5, 12, 16, 13.5], "texture": "#0"}, "west": {"uv": [1.5, 3, 8.5, 11], "texture": "#1"}
"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"}
}, },
"forge_data": { "block_light": 15, "sky_light": 15 } "forge_data": {
"block_light": 15,
"sky_light": 15
}
}, },
{ {
"name": "bottle", "name": "bottle",
@ -132,36 +134,5 @@
"west": {"uv": [8, 2.5, 12, 4.25], "texture": "#0"} "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]
}
}
} }