Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
ffbdb60
Update NodeNBTUtil: remove debug logging.
PriestOfFern Mar 2, 2025
80d03dd
Implement GasReaction Recipe and data loading
PriestOfFern Mar 2, 2025
ccd2a09
Implement recipe checking into tick function
PriestOfFern Mar 2, 2025
bd039e5
Merge pull request #3 from ValkyrienSkies/1.18.x/gas_reactions
PriestOfFern Mar 2, 2025
7026671
bump version
PriestOfFern Mar 2, 2025
ecf8490
redo formular for reaction calc
PriestOfFern Mar 2, 2025
86a1af7
Merge pull request #4 from ValkyrienSkies/1.18.x/gas_reactions
PriestOfFern Mar 2, 2025
7a4045a
fix infinite gas generation from reaction
PriestOfFern Mar 2, 2025
384e621
Merge branch '1.18.x/gas_reactions' into 1.18.x/main
PriestOfFern Mar 2, 2025
a467fa1
logging
PriestOfFern Mar 2, 2025
6614137
Add JEI to gradle
PriestOfFern Mar 16, 2025
d2bdbe3
Make KelvinJeiPlugin
PriestOfFern Mar 16, 2025
bc63cf4
implemented GasType JEI ingredient
PriestOfFern Mar 16, 2025
96b6c59
the world's ugliest jei category
PriestOfFern Mar 16, 2025
25f6845
use KelvinGasIngredient, instead of Gas
PriestOfFern Mar 16, 2025
0378b17
Add mole counter text
PriestOfFern Mar 16, 2025
e7d9997
Renderable Requirements
PriestOfFern Mar 20, 2025
8699ab4
Add Gibbs free energy change to gas reactions
PriestOfFern Apr 10, 2025
15172b0
Add Steam and Exhaust gas + make methane reaction more realistic
PriestOfFern Apr 10, 2025
a9563c6
Merge remote-tracking branch 'origin/1.18.x/main' into 1.18.x/gas_rea…
PriestOfFern Apr 10, 2025
ec3eb39
Merge pull request #5 from ValkyrienSkies/1.18.x/gas_reactions
PriestOfFern Apr 13, 2025
ad07252
broken WIP code. Too sleepy. Finish tomorrow
PriestOfFern Jun 7, 2025
2a05387
remove compiler args that i accidentally committed
PriestOfFern Jun 8, 2025
c6657a9
fully functional particle registry
PriestOfFern Jun 8, 2025
869a569
add DuctNetwork.createGasParticle() and particle test feature
PriestOfFern Jun 8, 2025
f7900f3
Merge pull request #6 from ValkyrienSkies/1.18.x/gas_particles
PriestOfFern Jun 8, 2025
48818bb
change values
PriestOfFern Jun 8, 2025
f3941c9
Made GasParticlePickerRegistry
PriestOfFern Jun 11, 2025
40bd546
Merge pull request #7 from ValkyrienSkies/1.18.x/gas_particles
PriestOfFern Jun 11, 2025
8c52e59
swap SimpleParticleType to ParticleOptions
PriestOfFern Jun 11, 2025
32ce14f
Merge remote-tracking branch 'origin/1.18.x/main' into 1.18.x/main
PriestOfFern Jun 11, 2025
f65aa10
Merge branch '1.18.x/main' into 1.18.x/JEI_integration
PriestOfFern Jun 11, 2025
d375a23
big commit
PriestOfFern Jun 12, 2025
3e7191f
fix everything
PriestOfFern Jun 12, 2025
9fd683b
make particles register on forge
PriestOfFern Jun 12, 2025
2c9f9f2
remove no longer needed combustible values in GasType
PriestOfFern Jun 12, 2025
9d1733b
bump mod version
PriestOfFern Jun 12, 2025
bd548b8
clean up code
PriestOfFern Jun 12, 2025
cbbeed4
bump mod version
PriestOfFern Jun 13, 2025
5bc6292
add basic particle textures
PriestOfFern Jun 13, 2025
a1990e9
ParticleSpawner Block
PriestOfFern Jun 13, 2025
d8559e8
fix ParticlePickerRegistry
PriestOfFern Jun 13, 2025
064a980
remove debug logging
PriestOfFern Jun 13, 2025
a699d90
make DefaultGasParticle not have randomized speed
PriestOfFern Jun 13, 2025
303d4db
Merge remote-tracking branch 'origin/1.20.x/main' into 1.18.x/main
PriestOfFern Jun 25, 2025
4c1bf4a
fix 1.18->1.20 differences
PriestOfFern Jun 25, 2025
c63be57
oops
PriestOfFern Jun 25, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions common/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,24 @@ loom {
accessWidenerPath = file("src/main/resources/kelvin.accesswidener")
}

repositories {
maven {
// location of the maven that hosts JEI files before January 2023
name = "Progwml6's maven"
url = "https://dvs1.progwml6.com/files/maven/"
}
maven {
// location of the maven that hosts JEI files since January 2023
name = "Jared's maven"
url = "https://maven.blamejared.com/"
}
maven {
// location of a maven mirror for JEI files, as a fallback
name = "ModMaven"
url = "https://modmaven.dev"
}
}

dependencies {
// We depend on fabric loader here to use the fabric @Environment annotations and get the mixin dependencies
// Do NOT use other classes from fabric loader
Expand All @@ -14,6 +32,9 @@ dependencies {
// Architectury API
modApi "dev.architectury:architectury:${rootProject.architectury_version}"

// JEI
modCompileOnly "mezz.jei:jei-${rootProject.minecraft_version}-common-api:${jei_version}"

api "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.10"
api "org.jetbrains.kotlin:kotlin-reflect:1.9.10"
}
Expand Down
25 changes: 22 additions & 3 deletions common/src/main/kotlin/org/valkyrienskies/kelvin/KelvinMod.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,27 +5,31 @@ import dev.architectury.event.events.client.ClientPlayerEvent
import dev.architectury.event.events.client.ClientTickEvent
import dev.architectury.event.events.common.ChunkEvent
import dev.architectury.event.events.common.LifecycleEvent
import dev.architectury.event.events.common.PlayerEvent
import dev.architectury.event.events.common.TickEvent
import dev.architectury.networking.simple.SimpleNetworkManager
import dev.architectury.platform.Platform
import dev.architectury.utils.Env
import net.minecraft.client.multiplayer.ClientLevel
import net.minecraft.nbt.CompoundTag
import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerLevel
import net.minecraft.world.level.chunk.ChunkAccess
import org.valkyrienskies.kelvin.api.DuctNetwork
import org.valkyrienskies.kelvin.api.DuctNodePos
import org.valkyrienskies.kelvin.debug.KelvinBlocks
import org.valkyrienskies.kelvin.impl.DuctNetworkServer
import org.valkyrienskies.kelvin.impl.GasTypeRegistry
import org.valkyrienskies.kelvin.impl.client.DuctNetworkClient
import org.valkyrienskies.kelvin.impl.logger
import org.valkyrienskies.kelvin.impl.registry.GasParticlePickerRegistry
import org.valkyrienskies.kelvin.impl.registry.GasTypeRegistry
import org.valkyrienskies.kelvin.impl.registry.ReactionRequirementRegistry
import org.valkyrienskies.kelvin.networking.KelvinNetworking
import org.valkyrienskies.kelvin.serialization.SerializableDuctNetwork
import org.valkyrienskies.kelvin.util.KelvinChunkPos
import org.valkyrienskies.kelvin.util.KelvinDamageSources
import org.valkyrienskies.kelvin.util.KelvinJacksonUtil


object KelvinMod {
const val MOD_ID = "kelvin"

Expand All @@ -38,11 +42,14 @@ object KelvinMod {
val Kelvin: DuctNetworkServer = DuctNetworkServer()
val KelvinClient: DuctNetworkClient = DuctNetworkClient()


@JvmStatic
fun init() {
KELVINLOGGER.info("Initializing Kelvin...")
networkManager = SimpleNetworkManager.create(MOD_ID)



LifecycleEvent.SERVER_BEFORE_START.register {
Kelvin.disabled = false
KELVINLOGGER.info("Enabling Kelvin...")
Expand Down Expand Up @@ -105,12 +112,16 @@ object KelvinMod {
}



KelvinParticles.init()
KelvinNetworking.init()
KelvinDamageSources.init()

KelvinBlocks.init()

KELVINLOGGER.info("Registering gas types...")
GasTypeRegistry.init()
ReactionRequirementRegistry.init()
GasParticlePickerRegistry.init()
KELVINLOGGER.info("--- --- ---")
KELVINLOGGER.info("Finished registering gas types. We have ${GasTypeRegistry.GAS_TYPES.size} gasses registered!")

Expand All @@ -119,6 +130,8 @@ object KelvinMod {

@JvmStatic
fun initClient() {


ClientPlayerEvent.CLIENT_PLAYER_JOIN.register {
if (Platform.getEnvironment() == Env.CLIENT) KelvinClient.disabled = false
}
Expand All @@ -130,6 +143,8 @@ object KelvinMod {
ClientTickEvent.CLIENT_LEVEL_POST.register {
KelvinClient.tick(it, 10) //todo substeps config
}


}

fun getKelvin(): DuctNetwork<ServerLevel> {
Expand All @@ -149,4 +164,8 @@ object KelvinMod {
}
return KelvinClient
}

fun asResouceLocation(string: String): ResourceLocation {
return ResourceLocation("${MOD_ID}:$string")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package org.valkyrienskies.kelvin

import dev.architectury.registry.client.particle.ParticleProviderRegistry
import dev.architectury.registry.registries.DeferredRegister
import dev.architectury.registry.registries.RegistrySupplier
import net.minecraft.core.registries.Registries
import org.valkyrienskies.kelvin.impl.client.particle.DefaultGasParticle.DefaultGasParticleType
import org.valkyrienskies.kelvin.impl.client.particle.DefaultGasParticleProvider



object KelvinParticles {

val ALL: HashSet<RegistrySupplier<DefaultGasParticleType>> = HashSet()
val PARTICLES = DeferredRegister.create(KelvinMod.MOD_ID, Registries.PARTICLE_TYPE)

fun registerDefaultParticle(name: String): RegistrySupplier<DefaultGasParticleType> {
val supplier = PARTICLES.register(name) { DefaultGasParticleType() }
ALL.add(supplier)
KelvinMod.KELVINLOGGER.info("Registered particle: ${supplier.id}")
return supplier
}

fun init() {
KelvinMod.KELVINLOGGER.info("Registering Kelvin default gas particles...")
PARTICLES.register()

}

object KelvinClientParticles {

fun registerDefaultParticle(supplier: RegistrySupplier<DefaultGasParticleType>) {
KelvinMod.KELVINLOGGER.info("Registered particle provider: ${supplier.id}")
ParticleProviderRegistry.register(supplier.get(), ::DefaultGasParticleProvider)
}

fun init() {
KelvinMod.KELVINLOGGER.info("Registering Kelvin default particle providers...")
ALL.forEach { entry ->
registerDefaultParticle(entry)
KelvinMod.KELVINLOGGER.info("Registered particle provider: ${entry.id}")
}

}

}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
package org.valkyrienskies.kelvin.api

import net.minecraft.resources.ResourceKey
import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerLevel
import net.minecraft.world.entity.player.Player
import net.minecraft.world.level.Level
import org.valkyrienskies.kelvin.KelvinMod.KELVINLOGGER
import org.valkyrienskies.kelvin.impl.DuctNodeInfo
import org.valkyrienskies.kelvin.impl.client.ClientKelvinInfo
import org.valkyrienskies.kelvin.util.KelvinChunkPos
import java.util.EnumMap
import java.util.logging.Logger

/**
* The main class representing the Duct Network.
Expand Down Expand Up @@ -73,7 +69,6 @@ interface DuctNetwork<T: Level> {
fun removeEdge(posA: DuctNodePos, posB: DuctNodePos) {
KELVINLOGGER.warn("You can't modify this from here. Called: removeEdge")
}

fun modTemperature(pos: DuctNodePos, deltaTemperature: Double) {
KELVINLOGGER.warn("You can't modify this from here. Called: modTemperature")
}
Expand All @@ -90,6 +85,8 @@ interface DuctNetwork<T: Level> {
KELVINLOGGER.warn("You can't modify this from here. Called: modHeatEnergy")
}

fun createGasParticle(level: T, gasType: GasType, pos: DuctNodePos, x: Double, y: Double, z: Double, xSpeed: Double, ySpeed: Double, zSpeed: Double)

// the real meat
fun tick(level: T, subSteps: Int = 1)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.valkyrienskies.kelvin.api

import com.google.gson.JsonElement

data class GasReaction(val gasses : HashMap<GasType, Int>, val requirements: HashMap<GasReactionRequirement, JsonElement>, val energy: Double = 0.0, val result: HashMap<GasType, Int>)

Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.valkyrienskies.kelvin.api

import com.google.gson.JsonElement
import net.minecraft.network.chat.Component
import net.minecraft.resources.ResourceLocation
import net.minecraft.world.level.Level


abstract class GasReactionRequirement(val resourceLocation: ResourceLocation) {

abstract fun apply_requirement(level: Level, ductNode: DuctNodePos, network: DuctNetwork<*>, value: JsonElement): Boolean

open fun get_text(value: JsonElement): Component {
return Component.literal("Empty Component")
}

}
15 changes: 10 additions & 5 deletions common/src/main/kotlin/org/valkyrienskies/kelvin/api/GasType.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package org.valkyrienskies.kelvin.api
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
import com.fasterxml.jackson.databind.annotation.JsonSerialize
import net.minecraft.resources.ResourceLocation
import org.valkyrienskies.kelvin.KelvinMod
import org.valkyrienskies.kelvin.util.KelvinKeyMapper

@JsonSerialize(using = KelvinKeyMapper.GasTypeSerializer::class)
Expand All @@ -16,12 +17,16 @@ data class GasType(
val thermalConductivity: Double, // (W / (m * K))
val sutherlandConstant: Double = 111.0, // (dimensionless) (see https://en.wikipedia.org/wiki/Viscosity#Temperature_dependence)
val adiabaticIndex: Double = 1.4, // (dimensionless) (see https://en.wikipedia.org/wiki/Adiabatic_index) Not required, 1.4 is air's. Technically an approximation, only useful for pockets, but oh well.
val combustible: Boolean = false, // Whether the gas can be used as fuel
val calorificValue: Double = 0.0, // (J / kg) (see https://en.wikipedia.org/wiki/Energy_density), only use if [combustible] is true
val iconLocation: ResourceLocation? = null
val iconLocation: ResourceLocation = PLACEHOLDER_ICON
) {

override fun toString(): String {
val iconLoc = iconLocation?.toString() ?: "null"
return "$name, $density, $viscosity, $specificHeatCapacity, $thermalConductivity, $sutherlandConstant, $adiabaticIndex, $combustible, $calorificValue, $iconLoc"
val iconLoc = iconLocation.toString()
return "{$name, $density, $viscosity, $specificHeatCapacity, $thermalConductivity, $sutherlandConstant, $adiabaticIndex, $iconLoc}"
}


companion object {
val PLACEHOLDER_ICON = KelvinMod.asResouceLocation("textures/icons/placeholder.png")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.valkyrienskies.kelvin.api

import net.minecraft.core.particles.ParticleOptions
import net.minecraft.world.level.Level

/*
A class for defining a ParticleTypePicker, which kelvin uses to pick out a ParticleType for anything it uses Particles for
*/
abstract class KelvinParticlePicker {
abstract fun chooseParticleOptions(level: Level, ductNodePos: DuctNodePos): ParticleOptions
}

Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,4 @@ class AllInOneDuctEdge(
override var aperture: Double = 0.0,
override var reversed: Boolean = false, override val filter: HashSet<GasType> = HashSet(), override var blacklist: Boolean = false,
override var unloaded: Boolean = false
) : DuctEdge, ApertureEdge, OneWayEdge, FilteredEdge {
}
) : DuctEdge, ApertureEdge, OneWayEdge, FilteredEdge
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,4 @@ class ApertureDuctEdge(
override var radius: Double = 0.125, override var length: Double = 0.5, override var currentFlowRate: Double = 0.0,
override var aperture: Double = 0.0,
override var unloaded: Boolean = false
) : DuctEdge, ApertureEdge {
}
) : DuctEdge, ApertureEdge
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.valkyrienskies.kelvin.api.edges

import org.valkyrienskies.kelvin.api.ConnectionType
import org.valkyrienskies.kelvin.api.DuctEdge
import org.valkyrienskies.kelvin.api.DuctNodePos
import org.valkyrienskies.kelvin.api.GasType

Expand All @@ -17,7 +16,4 @@ class ApertureFilteredDuctEdge(
override var blacklist: Boolean = false,
override var aperture: Double = 0.0,
override var unloaded: Boolean = false
) : ApertureEdge, FilteredEdge {


}
) : ApertureEdge, FilteredEdge
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,4 @@ class ApertureOneWayDuctEdge(
override var aperture: Double = 0.0,
override var reversed: Boolean = false,
override var unloaded: Boolean = false
) : DuctEdge, ApertureEdge, OneWayEdge {
}
) : DuctEdge, ApertureEdge, OneWayEdge
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package org.valkyrienskies.kelvin.api.edges

import org.valkyrienskies.kelvin.api.*
import org.valkyrienskies.kelvin.api.ConnectionType
import org.valkyrienskies.kelvin.api.DuctNodePos
import org.valkyrienskies.kelvin.api.GasType

/**
* A default edge type that has a filter which only allows certain gas types to flow through it. Its filter can either be a Whitelist or a Blacklist.
Expand All @@ -13,6 +15,4 @@ class FilteredDuctEdge(
override val filter: HashSet<GasType> = HashSet(),
override var blacklist: Boolean = false,
override var unloaded: Boolean = false
) : FilteredEdge {

}
) : FilteredEdge
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,4 @@ class PipeDuctEdge(
override val nodeB: DuctNodePos,
override var radius: Double = 0.125, override var length: Double = 0.5, override var currentFlowRate: Double = 0.0,
override var unloaded: Boolean = false
) : DuctEdge {
}
) : DuctEdge
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.valkyrienskies.kelvin.debug

import dev.architectury.registry.registries.DeferredRegister
import net.minecraft.core.registries.Registries
import net.minecraft.world.level.block.Blocks
import net.minecraft.world.level.block.state.BlockBehaviour
import org.valkyrienskies.kelvin.KelvinMod

object KelvinBlocks {
val BLOCKS = DeferredRegister.create(KelvinMod.MOD_ID, Registries.BLOCK)

val particleSpawner =
BLOCKS.register("particle_spawner") { ParticleSpawnerBlock(BlockBehaviour.Properties.of()) }

fun init() {
BLOCKS.register()
Blocks.HAY_BLOCK
}
}
Loading
Loading