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")
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")

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.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) {

View File

@ -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()
}
}

View File

@ -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)
}
}
}
}

View File

@ -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<Block, BlockState>) {
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")
}
}

View File

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

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