From 4bf4f504805cbf68e29cb659afd86d04c0f5b526 Mon Sep 17 00:00:00 2001 From: McArctic Date: Tue, 17 Feb 2026 00:00:01 -0500 Subject: [PATCH 1/7] Fixed Heat and Stress caluclations. Going to work on vein mine. --- .../registry/block/CreateOreDepositsBlocks.kt | 2 +- .../deposit_drill/DepositDrillBlockEntity.kt | 73 +++++++++++++------ .../registry/datagen/DataMapProvider.kt | 5 +- 3 files changed, 56 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/createcivilization/create_ore_deposits/registry/block/CreateOreDepositsBlocks.kt b/src/main/java/com/createcivilization/create_ore_deposits/registry/block/CreateOreDepositsBlocks.kt index 305b919..f6a3d68 100644 --- a/src/main/java/com/createcivilization/create_ore_deposits/registry/block/CreateOreDepositsBlocks.kt +++ b/src/main/java/com/createcivilization/create_ore_deposits/registry/block/CreateOreDepositsBlocks.kt @@ -40,7 +40,7 @@ object CreateOreDepositsBlocks { .properties { it.mapColor(MapColor.PODZOL).noOcclusion() } .transform(axeOrPickaxe()) .onRegister(movementBehaviour(DrillMovementBehaviour())) - .onRegister { b -> BlockStressValues.IMPACTS.register(b) { 4.0 } } + .onRegister { b -> BlockStressValues.IMPACTS.register(b) {100.0} } .item() .transform(customItemModel()) .register() diff --git a/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt b/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt index 75455cd..c84877f 100644 --- a/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt +++ b/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt @@ -35,6 +35,7 @@ import net.neoforged.neoforge.fluids.capability.IFluidHandler.FluidAction import net.neoforged.neoforge.items.IItemHandler import net.neoforged.neoforge.items.ItemStackHandler import java.util.function.Predicate +import kotlin.math.absoluteValue import kotlin.math.pow import kotlin.math.roundToInt @@ -56,7 +57,7 @@ class DepositDrillBlockEntity( private var drillOffset: Float = 0f private var lerpedOffset: LerpedFloat = LerpedFloat.linear().startWithValue(min) private var lastBlock: Block? = null - private var temperature: Float = 0f + private var temperature: Float = Config.SERVER.DEPOSIT_DRILL.baseTemperature private val itemHandler: ItemStackHandler = ItemStackHandler() private val drillTipHandler: ItemStackHandler = ItemStackHandler() @@ -153,12 +154,17 @@ class DepositDrillBlockEntity( override fun getBreakingPos(): BlockPos = if (canMine()) getTargetPos() else BlockPos.ZERO override fun calculateStressApplied(): Float { - val lubeFactor = getLubricantFactor().coerceIn(0f, 1f) - val baseStress = 512f * getBlockHardness(getTargetBlockState()) - val stressMultiplier = 0.5f + 0.5f * (1f - lubeFactor).pow(0.5f) + // su = rpm * 128 * (4 - lubeQuality) * hardness + //Hardness is an int between 1 and 10 + //Lubricant level is int between 0 and 3 - return baseStress * stressMultiplier + val lubricantFactor = getLubricantFactor() + val hardness = getBlockHardness(getTargetBlockState()) + + val su = 128 * (4 - lubricantFactor) * hardness + + return su } @@ -194,27 +200,43 @@ class DepositDrillBlockEntity( translate("tooltip.drill.header").forGoggles(tooltip) val targetBlock: Block? = level?.getBlockState(getDrillTipPos())?.block - if (targetBlock != null && targetBlock != Blocks.AIR) + if (targetBlock != null && targetBlock != Blocks.AIR) { translate("tooltip.drill.drilling", Component.translatable(targetBlock.descriptionId)) .style(ChatFormatting.GRAY) .forGoggles(tooltip) + } - if (!itemHandler[0].isEmpty) - translate("tooltip.drill.contains", Component.translatable(itemHandler[0].descriptionId), itemHandler[0].count) + if (!itemHandler[0].isEmpty) { + translate( + "tooltip.drill.contains", + Component.translatable(itemHandler[0].descriptionId), + itemHandler[0].count + ) .style(ChatFormatting.GREEN) .forGoggles(tooltip) + } val fluidInLubricantTank: FluidStack = lubricantHandler.getFluidInTank(0) - if (!fluidInLubricantTank.isEmpty) - translate("tooltip.drill.contains.lube", Component.translatable(fluidInLubricantTank.descriptionId), fluidInLubricantTank.amount) + if (!fluidInLubricantTank.isEmpty) { + translate( + "tooltip.drill.contains.lube", + Component.translatable(fluidInLubricantTank.descriptionId), + fluidInLubricantTank.amount + ) .style(ChatFormatting.GOLD) .forGoggles(tooltip) + } val fluidInCoolantTank: FluidStack = coolantHandler.getFluidInTank(0) - if (!fluidInCoolantTank.isEmpty) - translate("tooltip.drill.contains.coolant", Component.translatable(fluidInCoolantTank.descriptionId), fluidInCoolantTank.amount) + if (!fluidInCoolantTank.isEmpty) { + translate( + "tooltip.drill.contains.coolant", + Component.translatable(fluidInCoolantTank.descriptionId), + fluidInCoolantTank.amount + ) .style(ChatFormatting.BLUE) .forGoggles(tooltip) + } //Temp Prob @@ -271,20 +293,28 @@ class DepositDrillBlockEntity( } fun updateTemperature() { - val blockHardness = getBlockHardness(getTargetBlockState()) val coolingFactor = getCoolingFactor() + val lubricantFactor = getLubricantFactor() val baseCooling = Config.SERVER.DEPOSIT_DRILL.baseCooling - val baseTemperature: Float = Config.SERVER.DEPOSIT_DRILL.baseTemperature - val dampening = Config.SERVER.DEPOSIT_DRILL.dampening - val scale = Config.SERVER.DEPOSIT_DRILL.scale - val rpm: Float = if (this.speed < 0f) 0f else this.speed + val baseTemperature = Config.SERVER.DEPOSIT_DRILL.baseTemperature + + val targetState = getTargetBlockState() + val isMining = targetState != null && isBlockStateADeposit(targetState) && canMine() && speed > 0 + + val heatGen = if (isMining) { + speed * getBlockHardness(targetState) + } else { + 0.0f + } + + val dissipation = (baseCooling + lubricantFactor + coolingFactor).coerceAtLeast(0.1f) + + val equilibriumTemp = baseTemperature + (heatGen / dissipation) - val heating = blockHardness * rpm.pow(scale) * dampening - val effectiveCooling = baseCooling + (coolingFactor * 50f) - val cooling = effectiveCooling * (temperature - baseTemperature) * dampening + val approachRate = (0.02f * dissipation).coerceIn(0.01f, 1.0f) - temperature = (temperature + heating - cooling).coerceAtLeast(baseTemperature) + temperature += (equilibriumTemp - temperature) * approachRate } fun setLerpedOffset(value: Number) { @@ -397,6 +427,7 @@ class DepositDrillBlockEntity( } // FIXME: Why is this unused? What was it meant for? - Mavity + // Ngl, 0 clue - McArctic private val facingAxis: Direction.Axis = blockState.getValue(BlockStateProperties.HORIZONTAL_FACING).axis fun getItemHandler(direction: Direction): IItemHandler? { diff --git a/src/main/java/com/createcivilization/create_ore_deposits/registry/datagen/DataMapProvider.kt b/src/main/java/com/createcivilization/create_ore_deposits/registry/datagen/DataMapProvider.kt index 76c8116..71a68a3 100644 --- a/src/main/java/com/createcivilization/create_ore_deposits/registry/datagen/DataMapProvider.kt +++ b/src/main/java/com/createcivilization/create_ore_deposits/registry/datagen/DataMapProvider.kt @@ -1,5 +1,6 @@ package com.createcivilization.create_ore_deposits.registry.datagen +import com.createcivilization.create_ore_deposits.registry.block.CreateOreDepositsBlocks import com.createcivilization.create_ore_deposits.registry.datamap.CreateOreDepositsDataMaps import com.createcivilization.create_ore_deposits.registry.fluid.CreateOreDepositsFluids import net.minecraft.core.HolderLookup @@ -16,11 +17,11 @@ class DataMapProvider( override fun gather(provider: HolderLookup.Provider) { builder(CreateOreDepositsDataMaps.HARDNESS_DATA) - .add(BlockTags.DIRT, CreateOreDepositsDataMaps.HardnessData(0.1f), false) + .add(CreateOreDepositsBlocks.EXAMPLE_DEPOSIT.key, CreateOreDepositsDataMaps.HardnessData(5f), false) builder(CreateOreDepositsDataMaps.COOLING_FACTOR_DATA) - .add(FluidTags.WATER, CreateOreDepositsDataMaps.CoolingFactorData(5f), false) + .add(FluidTags.WATER, CreateOreDepositsDataMaps.CoolingFactorData(1f), false) builder(CreateOreDepositsDataMaps.LUBRICANT_FACTOR_DATA) .add(CreateOreDepositsFluids.LUBRICANT.key, CreateOreDepositsDataMaps.LubricantFactorData(1f), false) From b623cf73e6c8d96b080202b9d04e649e95156c0c Mon Sep 17 00:00:00 2001 From: McArctic Date: Tue, 17 Feb 2026 15:15:18 -0500 Subject: [PATCH 2/7] Possibly Broken Code. IDK. Class ended so I gotta commit and go to main pc. --- .../create_ore_deposits/CreateOreDeposits.kt | 2 +- .../create_ore_deposits/config/Config.kt | 8 --- .../deposit_drill/DepositDrillBlockEntity.kt | 55 +++++++++++++++---- .../registry/datagen/DataMapProvider.kt | 5 +- .../datamap/CreateOreDepositsDataMaps.kt | 16 +++--- 5 files changed, 54 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/createcivilization/create_ore_deposits/CreateOreDeposits.kt b/src/main/java/com/createcivilization/create_ore_deposits/CreateOreDeposits.kt index c1b0c1a..30abdd4 100644 --- a/src/main/java/com/createcivilization/create_ore_deposits/CreateOreDeposits.kt +++ b/src/main/java/com/createcivilization/create_ore_deposits/CreateOreDeposits.kt @@ -63,7 +63,7 @@ data object CreateOreDeposits { } private fun registerDataMapTypes(event: RegisterDataMapTypesEvent) { - event.register(CreateOreDepositsDataMaps.HARDNESS_DATA) + event.register(CreateOreDepositsDataMaps.DEPOSIT_DATA) event.register(CreateOreDepositsDataMaps.COOLING_FACTOR_DATA) } diff --git a/src/main/java/com/createcivilization/create_ore_deposits/config/Config.kt b/src/main/java/com/createcivilization/create_ore_deposits/config/Config.kt index 7046764..35a4ace 100644 --- a/src/main/java/com/createcivilization/create_ore_deposits/config/Config.kt +++ b/src/main/java/com/createcivilization/create_ore_deposits/config/Config.kt @@ -23,14 +23,6 @@ data object Config { internal val _baseTemperature: ModConfigSpec.DoubleValue = builder.defineInRange("baseTemperature", 293.0, -Double.MAX_VALUE, Double.MAX_VALUE) inline val baseTemperature: Float get() = _baseTemperature.get().toFloat() - - @PublishedApi - internal val _dampening: ModConfigSpec.DoubleValue = builder.defineInRange("dampening", 0.008, 0.0, Double.MAX_VALUE) - inline val dampening: Float get() = _dampening.get().toFloat() - - @PublishedApi - internal val _scale: ModConfigSpec.DoubleValue = builder.defineInRange("scale", 1.0, 0.0, Double.MAX_VALUE) - inline val scale: Float get() = _scale.get().toFloat() } } diff --git a/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt b/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt index c84877f..6937b2a 100644 --- a/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt +++ b/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt @@ -3,7 +3,7 @@ package com.createcivilization.create_ore_deposits.registry.block.entries.deposi import com.createcivilization.create_ore_deposits.config.Config import com.createcivilization.create_ore_deposits.registry.datamap.CreateOreDepositsDataMaps import com.createcivilization.create_ore_deposits.registry.datamap.CreateOreDepositsDataMaps.COOLING_FACTOR_DATA -import com.createcivilization.create_ore_deposits.registry.datamap.CreateOreDepositsDataMaps.HARDNESS_DATA +import com.createcivilization.create_ore_deposits.registry.datamap.CreateOreDepositsDataMaps.DEPOSIT_DATA import com.createcivilization.create_ore_deposits.registry.datamap.CreateOreDepositsDataMaps.LUBRICANT_FACTOR_DATA import com.createcivilization.create_ore_deposits.registry.fluid.CreateOreDepositsFluids import com.createcivilization.create_ore_deposits.registry.fluid.FluidHandler @@ -35,8 +35,6 @@ import net.neoforged.neoforge.fluids.capability.IFluidHandler.FluidAction import net.neoforged.neoforge.items.IItemHandler import net.neoforged.neoforge.items.ItemStackHandler import java.util.function.Predicate -import kotlin.math.absoluteValue -import kotlin.math.pow import kotlin.math.roundToInt // Minimum value for LerpedFloat to not get jumpy @@ -58,6 +56,10 @@ class DepositDrillBlockEntity( private var lerpedOffset: LerpedFloat = LerpedFloat.linear().startWithValue(min) private var lastBlock: Block? = null private var temperature: Float = Config.SERVER.DEPOSIT_DRILL.baseTemperature + private var maxAttempts: Int = 0 + private var remainingAttempts: Int = 0 + private var drillTickCounter: Int = 0 + private var currentDepositPos: BlockPos? = null private val itemHandler: ItemStackHandler = ItemStackHandler() private val drillTipHandler: ItemStackHandler = ItemStackHandler() @@ -106,16 +108,45 @@ class DepositDrillBlockEntity( * Simulates block drops for deposits, allowing deposits to return drops every break tick */ fun onBreakTick() { - if (!canMine()) - return + if (!canMine()) return + val targetPos = getTargetPos() val blockState = getTargetBlockState() ?: return - if (!isBlockStateADeposit(blockState)) - return - val serverLevel = level as? ServerLevel ?: return + if (!isBlockStateADeposit(blockState)) return - for (stack in getSimulatedDrops(blockState, serverLevel, getTargetPos())) { - itemHandler.insertItem(0, stack, false) + //Is deposit + + if(currentDepositPos != targetPos) { + currentDepositPos = targetPos + maxAttempts = blockState.blockHolder.getData(DEPOSIT_DATA)?.maxAttempts ?: 0 + remainingAttempts = maxAttempts + drillTickCounter = 0 } + + if(remainingAttempts <= 0) return + + drillTickCounter++ + val extractInterval = calculateExtractionInterval(); + + if(drillTickCounter >= extractInterval){ + drillTickCounter = 0 + remainingAttempts-- + val serverLevel = level as? ServerLevel ?: return + for (stack in getSimulatedDrops(blockState, serverLevel, getTargetPos())) { + itemHandler.insertItem(0, stack, false) + } + + //Update Destory Progess. + + if (remainingAttempts <= 0) { + level?.destroyBlockProgress(blockPos.hashCode(), targetPos, -1) + level?.setBlock(targetPos, Blocks.AIR.defaultBlockState(), 3) + currentDepositPos = null + } + } + } + + fun calculateExtractionInterval(): Int{ + return 1280 - (this.speed * 4).roundToInt() } fun getSimulatedDrops(state: BlockState, serverLevel: ServerLevel, pos: BlockPos) : List { @@ -275,8 +306,8 @@ class DepositDrillBlockEntity( } fun getBlockHardness(blockState: BlockState?): Float { - val hardnessData: CreateOreDepositsDataMaps.HardnessData = - blockState?.blockHolder?.getData(HARDNESS_DATA) ?: return 0.0f + val hardnessData: CreateOreDepositsDataMaps.DepositData = + blockState?.blockHolder?.getData(DEPOSIT_DATA) ?: return 0.0f return hardnessData.hardness } diff --git a/src/main/java/com/createcivilization/create_ore_deposits/registry/datagen/DataMapProvider.kt b/src/main/java/com/createcivilization/create_ore_deposits/registry/datagen/DataMapProvider.kt index 71a68a3..354b2fc 100644 --- a/src/main/java/com/createcivilization/create_ore_deposits/registry/datagen/DataMapProvider.kt +++ b/src/main/java/com/createcivilization/create_ore_deposits/registry/datagen/DataMapProvider.kt @@ -5,7 +5,6 @@ import com.createcivilization.create_ore_deposits.registry.datamap.CreateOreDepo import com.createcivilization.create_ore_deposits.registry.fluid.CreateOreDepositsFluids import net.minecraft.core.HolderLookup import net.minecraft.data.PackOutput -import net.minecraft.tags.BlockTags import net.minecraft.tags.FluidTags import net.neoforged.neoforge.common.data.DataMapProvider import java.util.concurrent.CompletableFuture @@ -16,8 +15,8 @@ class DataMapProvider( ) : DataMapProvider(packOutput, lookupProvider) { override fun gather(provider: HolderLookup.Provider) { - builder(CreateOreDepositsDataMaps.HARDNESS_DATA) - .add(CreateOreDepositsBlocks.EXAMPLE_DEPOSIT.key, CreateOreDepositsDataMaps.HardnessData(5f), false) + builder(CreateOreDepositsDataMaps.DEPOSIT_DATA) + .add(CreateOreDepositsBlocks.EXAMPLE_DEPOSIT.key, CreateOreDepositsDataMaps.DepositData(5f), false) builder(CreateOreDepositsDataMaps.COOLING_FACTOR_DATA) diff --git a/src/main/java/com/createcivilization/create_ore_deposits/registry/datamap/CreateOreDepositsDataMaps.kt b/src/main/java/com/createcivilization/create_ore_deposits/registry/datamap/CreateOreDepositsDataMaps.kt index 94258ef..d287563 100644 --- a/src/main/java/com/createcivilization/create_ore_deposits/registry/datamap/CreateOreDepositsDataMaps.kt +++ b/src/main/java/com/createcivilization/create_ore_deposits/registry/datamap/CreateOreDepositsDataMaps.kt @@ -1,7 +1,6 @@ package com.createcivilization.create_ore_deposits.registry.datamap import com.createcivilization.create_ore_deposits.CreateOreDeposits -import com.createcivilization.create_ore_deposits.registry.datamap.CreateOreDepositsDataMaps.LubricantFactorData import com.mojang.serialization.Codec import com.mojang.serialization.codecs.RecordCodecBuilder import net.minecraft.core.registries.Registries @@ -12,12 +11,13 @@ import net.neoforged.neoforge.registries.datamaps.DataMapType object CreateOreDepositsDataMaps { - data class HardnessData(val hardness: Float) { + data class DepositData(val maxAttempts: Int, val hardness: Float) { companion object { - val CODEC: Codec = RecordCodecBuilder.create { instance -> + val CODEC: Codec = RecordCodecBuilder.create { instance -> instance.group( - Codec.FLOAT.fieldOf("hardness").forGetter(HardnessData::hardness) - ).apply(instance, ::HardnessData) + Codec.INT.fieldOf("maxAttempts").forGetter(DepositData::maxAttempts), + Codec.FLOAT.fieldOf("hardness").forGetter(DepositData::hardness) + ).apply(instance, ::DepositData) } } } @@ -42,11 +42,11 @@ object CreateOreDepositsDataMaps { } } - val HARDNESS_DATA: DataMapType = + val DEPOSIT_DATA: DataMapType = DataMapType.builder( - ResourceLocation.fromNamespaceAndPath(CreateOreDeposits.MOD_ID, "hardness_data"), + ResourceLocation.fromNamespaceAndPath(CreateOreDeposits.MOD_ID, "deposit_data"), Registries.BLOCK, - HardnessData.CODEC + DepositData.CODEC ).build() val COOLING_FACTOR_DATA: DataMapType = From 7025e02187d323b2c9b1e067f5107774c4662428 Mon Sep 17 00:00:00 2001 From: McArctic Date: Tue, 17 Feb 2026 18:44:24 -0500 Subject: [PATCH 3/7] Kinda works. Lubricant Factor is not working for some reason. Coolant Works. --- .../registry/block/CreateOreDepositsBlocks.kt | 7 +--- .../deposit_drill/DepositDrillBlockEntity.kt | 41 ++++++++++++++++--- .../registry/datagen/DataMapProvider.kt | 4 +- .../registry/item/CreateOreDepositsItems.kt | 2 +- 4 files changed, 40 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/createcivilization/create_ore_deposits/registry/block/CreateOreDepositsBlocks.kt b/src/main/java/com/createcivilization/create_ore_deposits/registry/block/CreateOreDepositsBlocks.kt index f6a3d68..de87f7e 100644 --- a/src/main/java/com/createcivilization/create_ore_deposits/registry/block/CreateOreDepositsBlocks.kt +++ b/src/main/java/com/createcivilization/create_ore_deposits/registry/block/CreateOreDepositsBlocks.kt @@ -29,12 +29,6 @@ import net.minecraft.world.level.storage.loot.providers.number.ConstantValue object CreateOreDepositsBlocks { - val EXAMPLE_DEPOSIT: BlockEntry = REGISTRATE.block("example_deposit", ::Block) - .initialProperties(SharedProperties::stone) // Specify your custom tab - .simpleItem() - .register() - - val DRILL_BLOCK: BlockEntry = REGISTRATE.block("deposit_drill", ::DepositDrillBlock) .initialProperties(SharedProperties::stone) .properties { it.mapColor(MapColor.PODZOL).noOcclusion() } @@ -47,6 +41,7 @@ object CreateOreDepositsBlocks { // TEMP LOOT VALUES, CHANGE LATER. // Deposits + val EXAMPLE_DEPOSIT: BlockEntry = registerDepositGuaranteed("example_deposit", Blocks.STONE, Items.NETHERITE_BLOCK) val COAL_ORE_DEPOSIT: BlockEntry = registerDeposit("coal_ore_deposit", Blocks.COAL_ORE, Items.COAL, 3f, 0.8f) val IRON_ORE_DEPOSIT: BlockEntry = registerDepositSingleRoll("iron_ore_deposit", Blocks.IRON_ORE, Items.RAW_IRON, 0.8f) val GOLD_ORE_DEPOSIT: BlockEntry = registerDepositSingleRoll("gold_ore_deposit", Blocks.GOLD_ORE, Items.RAW_GOLD, 0.6f) diff --git a/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt b/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt index 6937b2a..e48c048 100644 --- a/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt +++ b/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt @@ -15,11 +15,13 @@ import com.simibubi.create.foundation.utility.ServerSpeedProvider import net.createmod.catnip.animation.LerpedFloat import net.createmod.catnip.nbt.NBTHelper import net.minecraft.ChatFormatting +import net.minecraft.client.Minecraft import net.minecraft.core.BlockPos import net.minecraft.core.Direction import net.minecraft.core.HolderLookup import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.nbt.CompoundTag +import net.minecraft.nbt.NbtUtils import net.minecraft.network.chat.Component import net.minecraft.server.level.ServerLevel import net.minecraft.world.item.ItemStack @@ -94,13 +96,17 @@ class DepositDrillBlockEntity( } updateTemperature() + onBreakTick() damageTip() } + override fun canBreak(stateToBreak: BlockState, blockHardness: Float): Boolean { + if (isBlockStateADeposit(stateToBreak)) return false + return super.canBreak(stateToBreak, blockHardness) + } + // Due to this always being called IMMEDIATELY before adding to the break tick, this allows us to do something every break tick. override fun getBreakSpeed(): Float { - onBreakTick() - return super.getBreakSpeed() } @@ -108,6 +114,7 @@ class DepositDrillBlockEntity( * Simulates block drops for deposits, allowing deposits to return drops every break tick */ fun onBreakTick() { + if (level?.isClientSide != false) return if (!canMine()) return val targetPos = getTargetPos() val blockState = getTargetBlockState() ?: return @@ -116,6 +123,7 @@ class DepositDrillBlockEntity( //Is deposit if(currentDepositPos != targetPos) { + clearDestroyProgress() currentDepositPos = targetPos maxAttempts = blockState.blockHolder.getData(DEPOSIT_DATA)?.maxAttempts ?: 0 remainingAttempts = maxAttempts @@ -136,6 +144,7 @@ class DepositDrillBlockEntity( } //Update Destory Progess. + updateDestroyProgress(targetPos) if (remainingAttempts <= 0) { level?.destroyBlockProgress(blockPos.hashCode(), targetPos, -1) @@ -145,8 +154,21 @@ class DepositDrillBlockEntity( } } + fun clearDestroyProgress() { + currentDepositPos?.let { pos -> + level?.destroyBlockProgress(blockPos.hashCode(), pos, -1) + } + } + + fun updateDestroyProgress(targetPos: BlockPos) { + if (maxAttempts <= 0) return + val attemptsUsed = maxAttempts - remainingAttempts + val stage = ((attemptsUsed.toFloat() / maxAttempts) * 10f).toInt().coerceIn(0, 9) + level?.destroyBlockProgress(blockPos.hashCode(), targetPos, stage) + } + fun calculateExtractionInterval(): Int{ - return 1280 - (this.speed * 4).roundToInt() + return 1025 - (this.speed * 4).roundToInt() } fun getSimulatedDrops(state: BlockState, serverLevel: ServerLevel, pos: BlockPos) : List { @@ -191,6 +213,7 @@ class DepositDrillBlockEntity( //Lubricant level is int between 0 and 3 val lubricantFactor = getLubricantFactor() + Minecraft.getInstance().player?.sendSystemMessage(Component.literal(lubricantFactor.toString())) val hardness = getBlockHardness(getTargetBlockState()) val su = 128 * (4 - lubricantFactor) * hardness @@ -202,9 +225,13 @@ class DepositDrillBlockEntity( override fun read(compound: CompoundTag, registries: HolderLookup.Provider, clientPacket: Boolean) { val nbt: CompoundTag = compound.getCompound("DepositDrill") + maxAttempts = nbt.getInt("MaxAttempts") + remainingAttempts = nbt.getInt("RemainingAttempts") + drillTickCounter = nbt.getInt("DrillTickCount") drillOffset = nbt.getFloat("DrillOffset") temperature = nbt.getFloat("Temperature") if (nbt.contains("LastBlock")) lastBlock = BuiltInRegistries.BLOCK.get(NBTHelper.readResourceLocation(nbt, "LastBlock")) + if (nbt.contains("CurrentDepositPos")) currentDepositPos = NBTHelper.readBlockPos(nbt, "CurrentDepositPos") itemHandler.deserializeNBT(registries, nbt.getCompound("ItemHandler")) drillTipHandler.deserializeNBT(registries, nbt.getCompound("DrillTipHandler")) lubricantHandler.deserializeNBT(registries, nbt.getCompound("Lubricant")) @@ -215,9 +242,14 @@ class DepositDrillBlockEntity( override fun write(compound: CompoundTag, registries: HolderLookup.Provider, clientPacket: Boolean) { val nbt = CompoundTag() + nbt.putInt("MaxAttempts", maxAttempts) + nbt.putInt("RemainingAttempts", remainingAttempts) + nbt.putInt("DrillTickCount", drillTickCounter) nbt.putFloat("DrillOffset", drillOffset) nbt.putFloat("Temperature", temperature) + if (lastBlock != null) NBTHelper.writeResourceLocation(nbt, "LastBlock", BuiltInRegistries.BLOCK.getKey(lastBlock!!)) + currentDepositPos?.let { nbt.put("CurrentDepositPos", NbtUtils.writeBlockPos(it)) } nbt.put("ItemHandler", itemHandler.serializeNBT(registries)) nbt.put("DrillTipHandler", drillTipHandler.serializeNBT(registries)) nbt.put("Lubricant", lubricantHandler.serializeNBT(registries)) @@ -312,8 +344,7 @@ class DepositDrillBlockEntity( } fun getLubricantFactor(): Float { - val lubricantFactorData: CreateOreDepositsDataMaps.LubricantFactorData = - lubricantHandler.getFluidInTank(1).fluidHolder.getData(LUBRICANT_FACTOR_DATA) ?: return 0.0f + val lubricantFactorData: CreateOreDepositsDataMaps.LubricantFactorData = lubricantHandler.getFluidInTank(1).fluidHolder.getData(LUBRICANT_FACTOR_DATA) ?: return 0.0f return lubricantFactorData.lubeFactor } diff --git a/src/main/java/com/createcivilization/create_ore_deposits/registry/datagen/DataMapProvider.kt b/src/main/java/com/createcivilization/create_ore_deposits/registry/datagen/DataMapProvider.kt index 354b2fc..cba358b 100644 --- a/src/main/java/com/createcivilization/create_ore_deposits/registry/datagen/DataMapProvider.kt +++ b/src/main/java/com/createcivilization/create_ore_deposits/registry/datagen/DataMapProvider.kt @@ -16,13 +16,13 @@ class DataMapProvider( override fun gather(provider: HolderLookup.Provider) { builder(CreateOreDepositsDataMaps.DEPOSIT_DATA) - .add(CreateOreDepositsBlocks.EXAMPLE_DEPOSIT.key, CreateOreDepositsDataMaps.DepositData(5f), false) + .add(CreateOreDepositsBlocks.EXAMPLE_DEPOSIT, CreateOreDepositsDataMaps.DepositData(10, 1f), false) builder(CreateOreDepositsDataMaps.COOLING_FACTOR_DATA) .add(FluidTags.WATER, CreateOreDepositsDataMaps.CoolingFactorData(1f), false) builder(CreateOreDepositsDataMaps.LUBRICANT_FACTOR_DATA) - .add(CreateOreDepositsFluids.LUBRICANT.key, CreateOreDepositsDataMaps.LubricantFactorData(1f), false) + .add(CreateOreDepositsFluids.LUBRICANT, CreateOreDepositsDataMaps.LubricantFactorData(1f), false) } } \ No newline at end of file diff --git a/src/main/java/com/createcivilization/create_ore_deposits/registry/item/CreateOreDepositsItems.kt b/src/main/java/com/createcivilization/create_ore_deposits/registry/item/CreateOreDepositsItems.kt index 14ed5fb..b7e7afa 100644 --- a/src/main/java/com/createcivilization/create_ore_deposits/registry/item/CreateOreDepositsItems.kt +++ b/src/main/java/com/createcivilization/create_ore_deposits/registry/item/CreateOreDepositsItems.kt @@ -8,7 +8,7 @@ import net.minecraft.world.item.Item object CreateOreDepositsItems { val DIAMOND_DRILL_TIP: ItemEntry = REGISTRATE.item("diamond_drill_tip", ::Item) - .properties {it.durability(2000).stacksTo(1).setNoRepair()} + .properties {it.durability(20000).stacksTo(1).setNoRepair()} .tag(CreateOreDepositsTags.DRILL_TIP) .defaultModel() .register() From 9d2f47eb85cfd651e5dd8ab98df194d5f8849a8a Mon Sep 17 00:00:00 2001 From: McArctic Date: Tue, 17 Feb 2026 19:45:48 -0500 Subject: [PATCH 4/7] Fixed Lubricant Factor! --- .../create_ore_deposits/CreateOreDeposits.kt | 1 + .../entries/deposit_drill/DepositDrillBlockEntity.kt | 8 +++++--- .../registry/datagen/DataMapProvider.kt | 2 +- .../registry/fluid/CreateOreDepositsFluids.kt | 2 ++ 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/createcivilization/create_ore_deposits/CreateOreDeposits.kt b/src/main/java/com/createcivilization/create_ore_deposits/CreateOreDeposits.kt index 30abdd4..0fc9874 100644 --- a/src/main/java/com/createcivilization/create_ore_deposits/CreateOreDeposits.kt +++ b/src/main/java/com/createcivilization/create_ore_deposits/CreateOreDeposits.kt @@ -65,6 +65,7 @@ data object CreateOreDeposits { private fun registerDataMapTypes(event: RegisterDataMapTypesEvent) { event.register(CreateOreDepositsDataMaps.DEPOSIT_DATA) event.register(CreateOreDepositsDataMaps.COOLING_FACTOR_DATA) + event.register(CreateOreDepositsDataMaps.LUBRICANT_FACTOR_DATA) } @SubscribeEvent diff --git a/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt b/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt index e48c048..72b52ca 100644 --- a/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt +++ b/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt @@ -349,9 +349,11 @@ class DepositDrillBlockEntity( } fun getCoolingFactor(): Float { - val coolingFactorData: CreateOreDepositsDataMaps.CoolingFactorData = - coolantHandler.getFluidInTank(1).fluidHolder.getData(COOLING_FACTOR_DATA) ?: return 0.0f - return coolingFactorData.coolingFactor + val fluidInTank = lubricantHandler.getFluidInTank(0) + val fluidHolder = fluidInTank.fluidHolder + val data = fluidHolder.getData(LUBRICANT_FACTOR_DATA) + val coolingFactor = data?.lubeFactor + return coolingFactor ?: 0.0f } fun updateTemperature() { diff --git a/src/main/java/com/createcivilization/create_ore_deposits/registry/datagen/DataMapProvider.kt b/src/main/java/com/createcivilization/create_ore_deposits/registry/datagen/DataMapProvider.kt index cba358b..b795bb8 100644 --- a/src/main/java/com/createcivilization/create_ore_deposits/registry/datagen/DataMapProvider.kt +++ b/src/main/java/com/createcivilization/create_ore_deposits/registry/datagen/DataMapProvider.kt @@ -23,6 +23,6 @@ class DataMapProvider( .add(FluidTags.WATER, CreateOreDepositsDataMaps.CoolingFactorData(1f), false) builder(CreateOreDepositsDataMaps.LUBRICANT_FACTOR_DATA) - .add(CreateOreDepositsFluids.LUBRICANT, CreateOreDepositsDataMaps.LubricantFactorData(1f), false) + .add(CreateOreDepositsFluids.LUBRICANT.get().source.builtInRegistryHolder(), CreateOreDepositsDataMaps.LubricantFactorData(1f), false) } } \ No newline at end of file diff --git a/src/main/java/com/createcivilization/create_ore_deposits/registry/fluid/CreateOreDepositsFluids.kt b/src/main/java/com/createcivilization/create_ore_deposits/registry/fluid/CreateOreDepositsFluids.kt index 0b5c313..ea39466 100644 --- a/src/main/java/com/createcivilization/create_ore_deposits/registry/fluid/CreateOreDepositsFluids.kt +++ b/src/main/java/com/createcivilization/create_ore_deposits/registry/fluid/CreateOreDepositsFluids.kt @@ -13,8 +13,10 @@ object CreateOreDepositsFluids { .fluid("lubricant", "block/fluid/lubricant_still".asResource(), "block/fluid/lubricant_flow".asResource()) .properties { it.viscosity(1500).density(500) } .fluidProperties { it.levelDecreasePerBlock(2).tickRate(25).slopeFindDistance(3).explosionResistance(100f) } + .source { BaseFlowingFluid.Source(it) } .register() + val SLAG: FluidEntry = CreateOreDeposits.REGISTRATE .fluid("slag", "block/fluid/slag_still".asResource(), "block/fluid/slag_flow".asResource()) .properties { it.viscosity(1500).density(500) } From d1c0df7c06d3348af7986dd8bf2f2a8aa0d984ef Mon Sep 17 00:00:00 2001 From: McArctic Date: Sat, 21 Feb 2026 22:34:45 -0500 Subject: [PATCH 5/7] 1 --- .../deposit_drill/DepositDrillBlockEntity.kt | 129 ++++-------------- .../registry/datagen/DataMapProvider.kt | 1 + .../create_ore_deposits/lang/en_us.json | 5 +- 3 files changed, 27 insertions(+), 108 deletions(-) diff --git a/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt b/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt index 72b52ca..60e57e2 100644 --- a/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt +++ b/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt @@ -2,7 +2,6 @@ package com.createcivilization.create_ore_deposits.registry.block.entries.deposi import com.createcivilization.create_ore_deposits.config.Config import com.createcivilization.create_ore_deposits.registry.datamap.CreateOreDepositsDataMaps -import com.createcivilization.create_ore_deposits.registry.datamap.CreateOreDepositsDataMaps.COOLING_FACTOR_DATA import com.createcivilization.create_ore_deposits.registry.datamap.CreateOreDepositsDataMaps.DEPOSIT_DATA import com.createcivilization.create_ore_deposits.registry.datamap.CreateOreDepositsDataMaps.LUBRICANT_FACTOR_DATA import com.createcivilization.create_ore_deposits.registry.fluid.CreateOreDepositsFluids @@ -10,6 +9,7 @@ import com.createcivilization.create_ore_deposits.registry.fluid.FluidHandler import com.createcivilization.create_ore_deposits.registry.tag.CreateOreDepositsTags import com.createcivilization.create_ore_deposits.util.translate import com.simibubi.create.content.kinetics.base.BlockBreakingKineticBlockEntity +import com.simibubi.create.foundation.item.TooltipHelper import com.simibubi.create.foundation.utility.BlockHelper import com.simibubi.create.foundation.utility.ServerSpeedProvider import net.createmod.catnip.animation.LerpedFloat @@ -24,6 +24,7 @@ import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.NbtUtils import net.minecraft.network.chat.Component import net.minecraft.server.level.ServerLevel +import net.minecraft.world.entity.vehicle.Minecart import net.minecraft.world.item.ItemStack import net.minecraft.world.level.Level import net.minecraft.world.level.block.Block @@ -32,7 +33,6 @@ import net.minecraft.world.level.block.entity.BlockEntityType import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.level.block.state.properties.BlockStateProperties import net.minecraft.world.level.material.Fluids -import net.neoforged.neoforge.fluids.FluidStack import net.neoforged.neoforge.fluids.capability.IFluidHandler.FluidAction import net.neoforged.neoforge.items.IItemHandler import net.neoforged.neoforge.items.ItemStackHandler @@ -118,7 +118,10 @@ class DepositDrillBlockEntity( if (!canMine()) return val targetPos = getTargetPos() val blockState = getTargetBlockState() ?: return - if (!isBlockStateADeposit(blockState)) return + if (!isBlockStateADeposit(blockState)) { + currentDepositPos = null + return + } //Is deposit @@ -213,7 +216,6 @@ class DepositDrillBlockEntity( //Lubricant level is int between 0 and 3 val lubricantFactor = getLubricantFactor() - Minecraft.getInstance().player?.sendSystemMessage(Component.literal(lubricantFactor.toString())) val hardness = getBlockHardness(getTargetBlockState()) val su = 128 * (4 - lubricantFactor) * hardness @@ -260,86 +262,13 @@ class DepositDrillBlockEntity( } override fun addToGoggleTooltip(tooltip: MutableList, isPlayerSneaking: Boolean): Boolean { - translate("tooltip.drill.header").forGoggles(tooltip) - - val targetBlock: Block? = level?.getBlockState(getDrillTipPos())?.block - if (targetBlock != null && targetBlock != Blocks.AIR) { - translate("tooltip.drill.drilling", Component.translatable(targetBlock.descriptionId)) - .style(ChatFormatting.GRAY) - .forGoggles(tooltip) - } - - if (!itemHandler[0].isEmpty) { - translate( - "tooltip.drill.contains", - Component.translatable(itemHandler[0].descriptionId), - itemHandler[0].count - ) - .style(ChatFormatting.GREEN) - .forGoggles(tooltip) - } - - val fluidInLubricantTank: FluidStack = lubricantHandler.getFluidInTank(0) - if (!fluidInLubricantTank.isEmpty) { - translate( - "tooltip.drill.contains.lube", - Component.translatable(fluidInLubricantTank.descriptionId), - fluidInLubricantTank.amount - ) - .style(ChatFormatting.GOLD) - .forGoggles(tooltip) - } - - val fluidInCoolantTank: FluidStack = coolantHandler.getFluidInTank(0) - if (!fluidInCoolantTank.isEmpty) { - translate( - "tooltip.drill.contains.coolant", - Component.translatable(fluidInCoolantTank.descriptionId), - fluidInCoolantTank.amount - ) - .style(ChatFormatting.BLUE) - .forGoggles(tooltip) - } - - //Temp Prob - - if (!drillTipHandler[0].isEmpty) { - val tipStack = drillTipHandler[0] - translate("tooltip.drill.tip.contains", Component.translatable(tipStack.descriptionId)) - .style(ChatFormatting.GREEN) - .forGoggles(tooltip) - - // Show durability if item is damageable - if (tipStack.isDamageableItem) { - val maxDurability = tipStack.maxDamage - val currentDamage = tipStack.damageValue - val remainingDurability = maxDurability - currentDamage - val durabilityPercent = (remainingDurability.toFloat() / maxDurability * 100).roundToInt() - - val durabilityColor = when { - durabilityPercent > 66 -> ChatFormatting.GREEN - durabilityPercent > 33 -> ChatFormatting.YELLOW - durabilityPercent > 10 -> ChatFormatting.GOLD - else -> ChatFormatting.RED - } - - translate("tooltip.drill.tip.durability", remainingDurability, maxDurability, durabilityPercent) - .style(durabilityColor) - .forGoggles(tooltip) - } - } - - - translate("tooltip.drill.heat", String.format("%.2f", temperature)) - .style(ChatFormatting.RED) - .forGoggles(tooltip) return super.addToGoggleTooltip(tooltip, isPlayerSneaking) } fun getBlockHardness(blockState: BlockState?): Float { val hardnessData: CreateOreDepositsDataMaps.DepositData = - blockState?.blockHolder?.getData(DEPOSIT_DATA) ?: return 0.0f + blockState?.blockHolder?.getData(DEPOSIT_DATA) ?: return 1.0f return hardnessData.hardness } @@ -426,50 +355,38 @@ class DepositDrillBlockEntity( } - private fun isBlockStateADeposit(state: BlockState): Boolean = state.`is`(CreateOreDepositsTags.DEPOSIT) + private fun isBlockStateADeposit(state: BlockState?): Boolean = state?.`is`(CreateOreDepositsTags.DEPOSIT) ?: false private fun getFurthestDepositConnectedToDeposit( level: Level, startingDepositPos: BlockPos ): BlockPos { val startingDepositState = level.getBlockState(startingDepositPos) - val connectedBlocks = getConnectedBlocksWithFilter(level, startingDepositPos, startingDepositState::equals) - - return connectedBlocks.maxByOrNull { blockPos -> - startingDepositPos.distSqr(blockPos) - } ?: startingDepositPos // fallback if list is empty + return getConnectedBlocksFurthest(level, startingDepositPos, startingDepositState::equals) } - private fun getConnectedBlocksWithFilter( + private fun getConnectedBlocksFurthest( level: Level, startingDepositPos: BlockPos, filter: Predicate - ): List { - val connected = mutableListOf() - val visited = mutableListOf() + ): BlockPos { + val visited = mutableSetOf(startingDepositPos) val queue = ArrayDeque() - queue += startingDepositPos - visited += startingDepositPos + var last = startingDepositPos + + val offsets = listOf( + BlockPos(1, 0, 0), BlockPos(-1, 0, 0), + BlockPos(0, 1, 0), BlockPos(0, -1, 0), + BlockPos(0, 0, 1), BlockPos(0, 0, -1) + ) while (queue.isNotEmpty()) { val current = queue.removeFirst() + last = current - if (!filter.test(level.getBlockState(current))) continue - - connected.add(current) - - val offsets = setOf( - BlockPos(1, 0, 0), - BlockPos(-1, 0, 0), - BlockPos(0, 1, 0), - BlockPos(0, -1, 0), - BlockPos(0, 0, 1), - BlockPos(0, 0, -1) - ) - val neighbors = offsets.map { pos -> current.offset(pos) } - - for (neighbor in neighbors) { + for (offset in offsets) { + val neighbor = current.offset(offset) if (neighbor !in visited && filter.test(level.getBlockState(neighbor))) { visited.add(neighbor) queue.add(neighbor) @@ -477,7 +394,7 @@ class DepositDrillBlockEntity( } } - return connected + return last } fun getDrillTipPos(): BlockPos = blockPos.offset(0, (-lerpedOffset.value.toInt() - 1), 0) diff --git a/src/main/java/com/createcivilization/create_ore_deposits/registry/datagen/DataMapProvider.kt b/src/main/java/com/createcivilization/create_ore_deposits/registry/datagen/DataMapProvider.kt index b795bb8..72a8d52 100644 --- a/src/main/java/com/createcivilization/create_ore_deposits/registry/datagen/DataMapProvider.kt +++ b/src/main/java/com/createcivilization/create_ore_deposits/registry/datagen/DataMapProvider.kt @@ -17,6 +17,7 @@ class DataMapProvider( override fun gather(provider: HolderLookup.Provider) { builder(CreateOreDepositsDataMaps.DEPOSIT_DATA) .add(CreateOreDepositsBlocks.EXAMPLE_DEPOSIT, CreateOreDepositsDataMaps.DepositData(10, 1f), false) + .add(CreateOreDepositsBlocks.DIAMOND_ORE_DEPOSIT, CreateOreDepositsDataMaps.DepositData(50, 5f), false) builder(CreateOreDepositsDataMaps.COOLING_FACTOR_DATA) diff --git a/src/main/resources/assets/create_ore_deposits/lang/en_us.json b/src/main/resources/assets/create_ore_deposits/lang/en_us.json index 001b5a5..3d4c14e 100644 --- a/src/main/resources/assets/create_ore_deposits/lang/en_us.json +++ b/src/main/resources/assets/create_ore_deposits/lang/en_us.json @@ -14,12 +14,13 @@ "fluid.create_ore_deposits.lubricant": "Lubricant", "create_ore_deposits.tooltip.drill.header": "Drill Information", - "create_ore_deposits.tooltip.drill.drilling": "Block: %1$s", + "create_ore_deposits.tooltip.drill.drilling": "Mining: %1$s", "create_ore_deposits.tooltip.drill.contains": "Item: %1$s x%2$s", - "create_ore_deposits.tooltip.drill.tip.contains": "Drill Tip: %1$s", + "create_ore_deposits.tooltip.drill.tip.contains": "Current Tip: %1$s", "create_ore_deposits.tooltip.drill.tip.durability": "Durability: %s / %s (%s%%)", "create_ore_deposits.tooltip.drill.contains.lube": "Lube: %1$s x%2$s", "create_ore_deposits.tooltip.drill.contains.coolant": "Coolant: %1$s x%2$s", + "create_ore_deposits.tooltip.drill.progress": "Current Progress: ", "create_ore_deposits.tooltip.drill.heat": "Heat: %s K", "create_ore_deposits.ponder.drill.intro.text_1": "This is a Drill. It Drills.", From 5e8d41f62f09dbf2831754d5b1534e84607a94b7 Mon Sep 17 00:00:00 2001 From: McArctic Date: Thu, 5 Mar 2026 00:56:05 -0500 Subject: [PATCH 6/7] Just a little refactor :) --- .../deposit_drill/DepositDrillBlockEntity.kt | 424 +++++++++--------- 1 file changed, 200 insertions(+), 224 deletions(-) diff --git a/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt b/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt index 60e57e2..baba52d 100644 --- a/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt +++ b/src/main/java/com/createcivilization/create_ore_deposits/registry/block/entries/deposit_drill/DepositDrillBlockEntity.kt @@ -1,7 +1,6 @@ package com.createcivilization.create_ore_deposits.registry.block.entries.deposit_drill import com.createcivilization.create_ore_deposits.config.Config -import com.createcivilization.create_ore_deposits.registry.datamap.CreateOreDepositsDataMaps import com.createcivilization.create_ore_deposits.registry.datamap.CreateOreDepositsDataMaps.DEPOSIT_DATA import com.createcivilization.create_ore_deposits.registry.datamap.CreateOreDepositsDataMaps.LUBRICANT_FACTOR_DATA import com.createcivilization.create_ore_deposits.registry.fluid.CreateOreDepositsFluids @@ -15,7 +14,6 @@ import com.simibubi.create.foundation.utility.ServerSpeedProvider import net.createmod.catnip.animation.LerpedFloat import net.createmod.catnip.nbt.NBTHelper import net.minecraft.ChatFormatting -import net.minecraft.client.Minecraft import net.minecraft.core.BlockPos import net.minecraft.core.Direction import net.minecraft.core.HolderLookup @@ -24,7 +22,6 @@ import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.NbtUtils import net.minecraft.network.chat.Component import net.minecraft.server.level.ServerLevel -import net.minecraft.world.entity.vehicle.Minecart import net.minecraft.world.item.ItemStack import net.minecraft.world.level.Level import net.minecraft.world.level.block.Block @@ -36,26 +33,18 @@ import net.minecraft.world.level.material.Fluids import net.neoforged.neoforge.fluids.capability.IFluidHandler.FluidAction import net.neoforged.neoforge.items.IItemHandler import net.neoforged.neoforge.items.ItemStackHandler -import java.util.function.Predicate import kotlin.math.roundToInt -// Minimum value for LerpedFloat to not get jumpy -private const val min = 0.5 +private const val MIN_LERP = 0.5 class DepositDrillBlockEntity( - type : BlockEntityType<*>, + type: BlockEntityType<*>, pos: BlockPos, blockState: BlockState ) : BlockBreakingKineticBlockEntity(type, pos, blockState) { - /** - * Allows array access syntax on the [itemHandler] property. - */ - operator fun ItemStackHandler.get(index: Int): ItemStack = this.getStackInSlot(index) - - // The Float value distance from the bottom of the drill, should always be positive private var drillOffset: Float = 0f - private var lerpedOffset: LerpedFloat = LerpedFloat.linear().startWithValue(min) + private var lerpedOffset: LerpedFloat = LerpedFloat.linear().startWithValue(MIN_LERP) private var lastBlock: Block? = null private var temperature: Float = Config.SERVER.DEPOSIT_DRILL.baseTemperature private var maxAttempts: Int = 0 @@ -63,16 +52,18 @@ class DepositDrillBlockEntity( private var drillTickCounter: Int = 0 private var currentDepositPos: BlockPos? = null - private val itemHandler: ItemStackHandler = ItemStackHandler() - private val drillTipHandler: ItemStackHandler = ItemStackHandler() - private val lubricantHandler: FluidHandler = FluidHandler( + private val itemHandler = ItemStackHandler() + private val drillTipHandler = ItemStackHandler() + + private val lubricantHandler = FluidHandler( 1000, mutableSetOf( CreateOreDepositsFluids.LUBRICANT.get(), CreateOreDepositsFluids.LUBRICANT.get().source ) ) - private val coolantHandler: FluidHandler = FluidHandler( + + private val coolantHandler = FluidHandler( 1000, mutableSetOf( Fluids.WATER, @@ -83,15 +74,14 @@ class DepositDrillBlockEntity( override fun tick() { super.tick() - val movementSpeed: Float = getMovementSpeed() - val canMove: Boolean = getTargetBlock() == Blocks.AIR || movementSpeed < 0 + val movementSpeed = getMovementSpeed() + val canMove = getTargetBlock() == Blocks.AIR || movementSpeed < 0 + lerpedOffset.forceNextSync() if (canMove) { drillOffset = (movementSpeed + drillOffset).coerceAtLeast(0f) - lerpedOffset.forceNextSync() setLerpedOffset(drillOffset) } else { - lerpedOffset.forceNextSync() setLerpedOffset(drillOffset.roundToInt()) } @@ -100,32 +90,40 @@ class DepositDrillBlockEntity( damageTip() } + override fun lazyTick() { + super.lazyTick() + setChanged() + sendData() + if (getMovementSpeed() != 0f) lubricantHandler.drain(1, FluidAction.EXECUTE) + } + override fun canBreak(stateToBreak: BlockState, blockHardness: Float): Boolean { - if (isBlockStateADeposit(stateToBreak)) return false + if (isDeposit(stateToBreak)) return false return super.canBreak(stateToBreak, blockHardness) } - // Due to this always being called IMMEDIATELY before adding to the break tick, this allows us to do something every break tick. - override fun getBreakSpeed(): Float { - return super.getBreakSpeed() - } + override fun getBreakSpeed(): Float = super.getBreakSpeed() + + override fun getBreakingPos(): BlockPos = if (canMine()) getTargetPos() else BlockPos.ZERO /** - * Simulates block drops for deposits, allowing deposits to return drops every break tick + * Handles per-tick extraction from deposit blocks. Unlike normal blocks + * (which break all at once), deposits yield drops over many ticks based + * on [maxAttempts] and the current extraction interval. */ fun onBreakTick() { if (level?.isClientSide != false) return if (!canMine()) return + val targetPos = getTargetPos() val blockState = getTargetBlockState() ?: return - if (!isBlockStateADeposit(blockState)) { + + if (!isDeposit(blockState)) { currentDepositPos = null return } - //Is deposit - - if(currentDepositPos != targetPos) { + if (currentDepositPos != targetPos) { clearDestroyProgress() currentDepositPos = targetPos maxAttempts = blockState.blockHolder.getData(DEPOSIT_DATA)?.maxAttempts ?: 0 @@ -133,20 +131,20 @@ class DepositDrillBlockEntity( drillTickCounter = 0 } - if(remainingAttempts <= 0) return + if (remainingAttempts <= 0) return drillTickCounter++ - val extractInterval = calculateExtractionInterval(); + val extractInterval = calculateExtractionInterval() - if(drillTickCounter >= extractInterval){ + if (drillTickCounter >= extractInterval) { drillTickCounter = 0 remainingAttempts-- + val serverLevel = level as? ServerLevel ?: return - for (stack in getSimulatedDrops(blockState, serverLevel, getTargetPos())) { + for (stack in getSimulatedDrops(blockState, serverLevel, targetPos)) { itemHandler.insertItem(0, stack, false) } - //Update Destory Progess. updateDestroyProgress(targetPos) if (remainingAttempts <= 0) { @@ -157,6 +155,32 @@ class DepositDrillBlockEntity( } } + fun canMine(): Boolean { + val tip = drillTipHandler.getStackInSlot(0) + if (tip.isEmpty) return false + + val inventory = itemHandler.getStackInSlot(0) + if (inventory.isEmpty) return true + + val notFull = inventory.count != itemHandler.getSlotLimit(0) + return notFull && getTargetBlock() == lastBlock + } + + fun calculateExtractionInterval(): Int = 1025 - (speed * 4).roundToInt() + + fun getSimulatedDrops(state: BlockState, serverLevel: ServerLevel, pos: BlockPos): List { + return Block.getDrops(state, serverLevel, pos, null, null, ItemStack.EMPTY) + } + + override fun onBlockBroken(stateToBreak: BlockState) { + lastBlock = getTargetBlock() + BlockHelper.destroyBlock(level, breakingPos, 1f) { drops: ItemStack -> + if (!isDeposit(stateToBreak)) { + itemHandler.insertItem(0, drops, false) + } + } + } + fun clearDestroyProgress() { currentDepositPos?.let { pos -> level?.destroyBlockProgress(blockPos.hashCode(), pos, -1) @@ -170,70 +194,146 @@ class DepositDrillBlockEntity( level?.destroyBlockProgress(blockPos.hashCode(), targetPos, stage) } - fun calculateExtractionInterval(): Int{ - return 1025 - (this.speed * 4).roundToInt() - } + fun updateTemperature() { + val baseCooling = Config.SERVER.DEPOSIT_DRILL.baseCooling + val baseTemperature = Config.SERVER.DEPOSIT_DRILL.baseTemperature - fun getSimulatedDrops(state: BlockState, serverLevel: ServerLevel, pos: BlockPos) : List { - return Block.getDrops(state, serverLevel, pos, null, null, ItemStack.EMPTY) + val targetState = getTargetBlockState() + val isMining = targetState != null && isDeposit(targetState) && canMine() && speed > 0 + + val heatGen = if (isMining) speed * getBlockHardness(targetState) else 0.0f + + val dissipation = (baseCooling + getLubricantFactor() + getCoolingFactor()).coerceAtLeast(0.1f) + val equilibriumTemp = baseTemperature + (heatGen / dissipation) + val approachRate = (0.02f * dissipation).coerceIn(0.01f, 1.0f) + + temperature += (equilibriumTemp - temperature) * approachRate } - fun canMine(): Boolean { - val inventory = itemHandler[0] - val drillTipInventory = drillTipHandler[0] - val inventoryNotFull = inventory.count != itemHandler.getSlotLimit(0) - val targetBlockIsTheSameAsLastBlock = getTargetBlock() == lastBlock + private fun damageTip() { + val itemStack = drillTipHandler.getStackInSlot(0) + if (itemStack.isEmpty || !itemStack.tags.anyMatch(CreateOreDepositsTags.DRILL_TIP::equals)) return + + val excessTemp = (temperature - Config.SERVER.DEPOSIT_DRILL.baseTemperature).coerceAtLeast(0f) - if(drillTipInventory.isEmpty){ - return false + val damage = when { + excessTemp < 20f -> 0 + excessTemp < 50f -> 1 + excessTemp < 100f -> ((excessTemp - 50f) / 25f).toInt() + 1 + else -> ((excessTemp - 100f) / 20f + 3f).toInt().coerceAtMost(8) } - return inventory.isEmpty || (inventoryNotFull && targetBlockIsTheSameAsLastBlock) + if (damage < 1) return + + val world = level as? ServerLevel ?: return + itemStack.hurtAndBreak(damage, world, null) { + drillTipHandler.setStackInSlot(0, ItemStack.EMPTY) + notifyUpdate() + } } - override fun lazyTick() { - super.lazyTick() - setChanged() - sendData() - if (getMovementSpeed() != 0f) lubricantHandler.drain(1, FluidAction.EXECUTE) + override fun calculateStressApplied(): Float { + // SU = 128 * (4 - lubeFactor) * hardness + val lubricantFactor = getLubricantFactor() + val hardness = getBlockHardness(getTargetBlockState()) + return 128 * (4 - lubricantFactor) * hardness } - override fun onBlockBroken(stateToBreak: BlockState) { - lastBlock = getTargetBlock() - BlockHelper.destroyBlock(level, breakingPos, 1f) { drops: ItemStack -> - // Since onBreakTick() already inserts deposit drops into the inventory, we skip them to not add twice on break - if (!isBlockStateADeposit(stateToBreak)) - itemHandler.insertItem(0, drops, false) + fun getBlockHardness(blockState: BlockState?): Float { + return blockState?.blockHolder?.getData(DEPOSIT_DATA)?.hardness ?: 1.0f + } + + fun getLubricantFactor(): Float { + return lubricantHandler.getFluidInTank(1) + .fluidHolder + .getData(LUBRICANT_FACTOR_DATA) + ?.lubeFactor ?: 0.0f + } + + fun getCoolingFactor(): Float { + return coolantHandler.getFluidInTank(0) + .fluidHolder + .getData(LUBRICANT_FACTOR_DATA) + ?.lubeFactor ?: 0.0f + } + + private fun isDeposit(state: BlockState?): Boolean = state?.`is`(CreateOreDepositsTags.DEPOSIT) ?: false + + fun getTargetBlock(): Block? = getTargetBlockState()?.block + + fun getTargetBlockState(): BlockState? = level?.getBlockState(getTargetPos()) + + fun getTargetPos(): BlockPos { + val tip = getDrillTipPos() + val stateAtTip = level?.getBlockState(tip) + + return if (stateAtTip?.let(::isDeposit) == true) { + getFurthestConnectedDeposit(level!!, tip) + } else { + tip } } - override fun getBreakingPos(): BlockPos = if (canMine()) getTargetPos() else BlockPos.ZERO + fun getDrillTipPos(): BlockPos = blockPos.offset(0, -lerpedOffset.value.toInt() - 1, 0) - override fun calculateStressApplied(): Float { + private fun getFurthestConnectedDeposit(level: Level, start: BlockPos): BlockPos { + val startState = level.getBlockState(start) + return getFurthestConnectedBlock(level, start) { it == startState } + } - // su = rpm * 128 * (4 - lubeQuality) * hardness - //Hardness is an int between 1 and 10 - //Lubricant level is int between 0 and 3 + private fun getFurthestConnectedBlock( + level: Level, + start: BlockPos, + filter: (BlockState) -> Boolean + ): BlockPos { + val visited = mutableSetOf(start) + val queue = ArrayDeque() + queue += start + var last = start - val lubricantFactor = getLubricantFactor() - val hardness = getBlockHardness(getTargetBlockState()) + while (queue.isNotEmpty()) { + val current = queue.removeFirst() + last = current - val su = 128 * (4 - lubricantFactor) * hardness + for (dir in Direction.entries) { + val neighbor = current.relative(dir) + if (neighbor !in visited && filter(level.getBlockState(neighbor))) { + visited += neighbor + queue += neighbor + } + } + } - return su + return last } + fun getInterpolatedOffset(partialTicks: Float): Float = + lerpedOffset.getValue(partialTicks).coerceAtLeast(3 / 16f) + + fun getMovementSpeed(): Float { + var movementSpeed = convertToLinear(getSpeed()) + if (level!!.isClientSide) movementSpeed *= ServerSpeedProvider.get() + return movementSpeed + } + + private fun setLerpedOffset(value: Number) { + lerpedOffset.setValue(value.toDouble().coerceAtLeast(MIN_LERP)) + } override fun read(compound: CompoundTag, registries: HolderLookup.Provider, clientPacket: Boolean) { - val nbt: CompoundTag = compound.getCompound("DepositDrill") + val nbt = compound.getCompound("DepositDrill") maxAttempts = nbt.getInt("MaxAttempts") remainingAttempts = nbt.getInt("RemainingAttempts") drillTickCounter = nbt.getInt("DrillTickCount") drillOffset = nbt.getFloat("DrillOffset") temperature = nbt.getFloat("Temperature") - if (nbt.contains("LastBlock")) lastBlock = BuiltInRegistries.BLOCK.get(NBTHelper.readResourceLocation(nbt, "LastBlock")) - if (nbt.contains("CurrentDepositPos")) currentDepositPos = NBTHelper.readBlockPos(nbt, "CurrentDepositPos") + + if (nbt.contains("LastBlock")) + lastBlock = BuiltInRegistries.BLOCK.get(NBTHelper.readResourceLocation(nbt, "LastBlock")) + if (nbt.contains("CurrentDepositPos")) + currentDepositPos = NBTHelper.readBlockPos(nbt, "CurrentDepositPos") + itemHandler.deserializeNBT(registries, nbt.getCompound("ItemHandler")) drillTipHandler.deserializeNBT(registries, nbt.getCompound("DrillTipHandler")) lubricantHandler.deserializeNBT(registries, nbt.getCompound("Lubricant")) @@ -244,14 +344,20 @@ class DepositDrillBlockEntity( override fun write(compound: CompoundTag, registries: HolderLookup.Provider, clientPacket: Boolean) { val nbt = CompoundTag() + nbt.putInt("MaxAttempts", maxAttempts) nbt.putInt("RemainingAttempts", remainingAttempts) nbt.putInt("DrillTickCount", drillTickCounter) nbt.putFloat("DrillOffset", drillOffset) nbt.putFloat("Temperature", temperature) - if (lastBlock != null) NBTHelper.writeResourceLocation(nbt, "LastBlock", BuiltInRegistries.BLOCK.getKey(lastBlock!!)) - currentDepositPos?.let { nbt.put("CurrentDepositPos", NbtUtils.writeBlockPos(it)) } + lastBlock?.let { + NBTHelper.writeResourceLocation(nbt, "LastBlock", BuiltInRegistries.BLOCK.getKey(it)) + } + currentDepositPos?.let { + nbt.put("CurrentDepositPos", NbtUtils.writeBlockPos(it)) + } + nbt.put("ItemHandler", itemHandler.serializeNBT(registries)) nbt.put("DrillTipHandler", drillTipHandler.serializeNBT(registries)) nbt.put("Lubricant", lubricantHandler.serializeNBT(registries)) @@ -262,167 +368,37 @@ class DepositDrillBlockEntity( } override fun addToGoggleTooltip(tooltip: MutableList, isPlayerSneaking: Boolean): Boolean { + translate("tooltip.drill.header").forGoggles(tooltip) - return super.addToGoggleTooltip(tooltip, isPlayerSneaking) - } - - fun getBlockHardness(blockState: BlockState?): Float { - val hardnessData: CreateOreDepositsDataMaps.DepositData = - blockState?.blockHolder?.getData(DEPOSIT_DATA) ?: return 1.0f - return hardnessData.hardness - } - - fun getLubricantFactor(): Float { - val lubricantFactorData: CreateOreDepositsDataMaps.LubricantFactorData = lubricantHandler.getFluidInTank(1).fluidHolder.getData(LUBRICANT_FACTOR_DATA) ?: return 0.0f - return lubricantFactorData.lubeFactor - } - - fun getCoolingFactor(): Float { - val fluidInTank = lubricantHandler.getFluidInTank(0) - val fluidHolder = fluidInTank.fluidHolder - val data = fluidHolder.getData(LUBRICANT_FACTOR_DATA) - val coolingFactor = data?.lubeFactor - return coolingFactor ?: 0.0f - } - - fun updateTemperature() { - val coolingFactor = getCoolingFactor() - val lubricantFactor = getLubricantFactor() - - val baseCooling = Config.SERVER.DEPOSIT_DRILL.baseCooling - val baseTemperature = Config.SERVER.DEPOSIT_DRILL.baseTemperature - - val targetState = getTargetBlockState() - val isMining = targetState != null && isBlockStateADeposit(targetState) && canMine() && speed > 0 - - val heatGen = if (isMining) { - speed * getBlockHardness(targetState) - } else { - 0.0f + val targetBlock = getTargetBlockState()?.block + if (targetBlock != null && targetBlock != Blocks.AIR) { + translate("tooltip.drill.drilling", Component.translatable(targetBlock.descriptionId)) + .style(ChatFormatting.GRAY) + .forGoggles(tooltip) } - val dissipation = (baseCooling + lubricantFactor + coolingFactor).coerceAtLeast(0.1f) - - val equilibriumTemp = baseTemperature + (heatGen / dissipation) - - val approachRate = (0.02f * dissipation).coerceIn(0.01f, 1.0f) - - temperature += (equilibriumTemp - temperature) * approachRate - } - - fun setLerpedOffset(value: Number) { - lerpedOffset.setValue(value.toDouble().coerceAtLeast(min)) - } - - fun getTargetBlock(): Block = getTargetBlockState()?.block!! - - fun getTargetBlockState(): BlockState? { - // This now simply returns the block state at the resolved target position. - return level?.getBlockState(getTargetPos()) - } - - fun getTargetPos(): BlockPos { - val tip: BlockPos = getDrillTipPos() - val stateAtTip: BlockState? = level?.getBlockState(tip) - - val blockAtDrillTipIsADepositBlock: Boolean = stateAtTip?.let(::isBlockStateADeposit) == true - - return if (blockAtDrillTipIsADepositBlock) getFurthestDepositConnectedToDeposit(level!!, tip) else tip - } - - private fun damageTip() { - val itemStack = drillTipHandler[0] - if (itemStack.isEmpty || !itemStack.tags.anyMatch(CreateOreDepositsTags.DRILL_TIP::equals)) return - - val baseTemp = Config.SERVER.DEPOSIT_DRILL.baseTemperature // ~293K - val excessTemp = (temperature - baseTemp).coerceAtLeast(0f) - - val damage = when { - excessTemp < 20f -> 0 // Safe: < 313K - excessTemp < 50f -> 1 // Caution: 313-343K - excessTemp < 100f -> ((excessTemp - 50f) / 25f).toInt() + 1 // Danger: 343-393K - else -> ((excessTemp - 100f) / 20f + 3f).toInt().coerceAtMost(8) // Critical: > 393K + if (isDeposit(getTargetBlockState())) { + val attemptsUsed = maxAttempts - remainingAttempts + val stage = ((attemptsUsed.toFloat() / maxAttempts) * 10f).toInt().coerceIn(0, 10) + val bar = TooltipHelper.makeProgressBar(10, stage) + translate("tooltip.drill.progress") + .add(Component.literal(bar)) + .forGoggles(tooltip) } - if (damage < 1) return - - val world = level - if (world !is ServerLevel) return - itemStack.hurtAndBreak(damage, world, null) { - drillTipHandler.setStackInSlot(0, ItemStack.EMPTY) - notifyUpdate() - } - } - - - private fun isBlockStateADeposit(state: BlockState?): Boolean = state?.`is`(CreateOreDepositsTags.DEPOSIT) ?: false - - private fun getFurthestDepositConnectedToDeposit( - level: Level, - startingDepositPos: BlockPos - ): BlockPos { - val startingDepositState = level.getBlockState(startingDepositPos) - return getConnectedBlocksFurthest(level, startingDepositPos, startingDepositState::equals) - } - - private fun getConnectedBlocksFurthest( - level: Level, - startingDepositPos: BlockPos, - filter: Predicate - ): BlockPos { - val visited = mutableSetOf(startingDepositPos) - val queue = ArrayDeque() - queue += startingDepositPos - var last = startingDepositPos - - val offsets = listOf( - BlockPos(1, 0, 0), BlockPos(-1, 0, 0), - BlockPos(0, 1, 0), BlockPos(0, -1, 0), - BlockPos(0, 0, 1), BlockPos(0, 0, -1) - ) - - while (queue.isNotEmpty()) { - val current = queue.removeFirst() - last = current - - for (offset in offsets) { - val neighbor = current.offset(offset) - if (neighbor !in visited && filter.test(level.getBlockState(neighbor))) { - visited.add(neighbor) - queue.add(neighbor) - } - } - } - - return last - } - - fun getDrillTipPos(): BlockPos = blockPos.offset(0, (-lerpedOffset.value.toInt() - 1), 0) - - fun getInterpolatedOffset(partialTicks: Float): Float = lerpedOffset.getValue(partialTicks).coerceAtLeast(3 / 16f) - - fun getMovementSpeed(): Float { - var movementSpeed = convertToLinear(getSpeed()) - if (level!!.isClientSide) movementSpeed *= ServerSpeedProvider.get() - return movementSpeed + return super.addToGoggleTooltip(tooltip, isPlayerSneaking) } - // FIXME: Why is this unused? What was it meant for? - Mavity - // Ngl, 0 clue - McArctic - private val facingAxis: Direction.Axis = blockState.getValue(BlockStateProperties.HORIZONTAL_FACING).axis - fun getItemHandler(direction: Direction): IItemHandler? { - //Grabs block state and checks if the right side of the block. If it is we can slap a funnel on it. - return if (direction == blockState.getValue(BlockStateProperties.HORIZONTAL_FACING).counterClockWise) itemHandler else null + val outputSide = blockState.getValue(BlockStateProperties.HORIZONTAL_FACING).counterClockWise + return if (direction == outputSide) itemHandler else null } - fun getDrillTipItemHandler(): IItemHandler { - return drillTipHandler - } + fun getDrillTipItemHandler(): IItemHandler = drillTipHandler - // Checks if the axis is the Y axis (up and down) and if its positive (just up) thus from the top fun getFluidHandler(direction: Direction): FluidHandler? = when { - direction.axis == Direction.Axis.Y && direction.axisDirection == Direction.AxisDirection.POSITIVE -> lubricantHandler + direction.axis == Direction.Axis.Y + && direction.axisDirection == Direction.AxisDirection.POSITIVE -> lubricantHandler direction == blockState.getValue(BlockStateProperties.HORIZONTAL_FACING).opposite -> coolantHandler else -> null } From eca3e373d7fdd16ae6fb4823602480f8a526d762 Mon Sep 17 00:00:00 2001 From: McArctic Date: Thu, 5 Mar 2026 02:30:30 -0500 Subject: [PATCH 7/7] Added a readme to help keep me on track and have a solid todo list --- README.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..fbeed1b --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +# ⛏Create: Ore Deposits + +**An addon for the [Create](https://modrinth.com/mod/create) mod** + +This mod aims to add drills and deposits to allow for a more fair way to get large quantities of materials. + +> **This mod is a work in progress.** Many features are uncompleted, unbalanced, placeholders, or entirely subject to change/removal. +> +> **THIS IS NOT READY FOR SURVIVAL PLAY** + +--- + +## TODO + +### Drill System +- [ ] Heat tooltip +- [ ] Tip type tooltip +- [ ] Lubricant tooltip +- [ ] Coolant tooltip +- [ ] Temperature affects tip durability +- [ ] Deposits require matching tip type +- [ ] Crafting recipes for drills and tips + +### Fluids +- [ ] Tiered lubricants +- [ ] Tiered coolants + +### Refinement +- [ ] Unprocessed ore items +- [ ] Refining recipe tree + +### World & Polish +- [ ] Worldgen for ore deposits +- [ ] Textures & models +- [ ] Ponder scenes + +--- + +## Contributing + +This project is still "early" in development. Any contributions like textures, features, or even just balancing is GREATLY appreciated. \ No newline at end of file