Skip to content

Commit f65aa10

Browse files
committed
Merge branch '1.18.x/main' into 1.18.x/JEI_integration
# Conflicts: # common/src/main/kotlin/org/valkyrienskies/kelvin/impl/registry/GasTypeRegistry.kt
2 parents e7d9997 + 32ce14f commit f65aa10

25 files changed

+302
-32
lines changed

common/src/main/kotlin/org/valkyrienskies/kelvin/KelvinMod.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ import net.minecraft.world.level.chunk.ChunkAccess
1717
import org.valkyrienskies.kelvin.api.DuctNetwork
1818
import org.valkyrienskies.kelvin.api.DuctNodePos
1919
import org.valkyrienskies.kelvin.impl.DuctNetworkServer
20-
import org.valkyrienskies.kelvin.impl.GasTypeRegistry
21-
import org.valkyrienskies.kelvin.impl.ReactionRequirementRegistry
20+
import org.valkyrienskies.kelvin.impl.registry.ReactionRequirementRegistry
2221
import org.valkyrienskies.kelvin.impl.client.DuctNetworkClient
2322
import org.valkyrienskies.kelvin.impl.logger
23+
import org.valkyrienskies.kelvin.impl.registry.GasParticlePickerRegistry
24+
import org.valkyrienskies.kelvin.impl.registry.GasTypeRegistry
2425
import org.valkyrienskies.kelvin.networking.KelvinNetworking
2526
import org.valkyrienskies.kelvin.serialization.SerializableDuctNetwork
2627
import org.valkyrienskies.kelvin.util.KelvinChunkPos
@@ -44,6 +45,8 @@ object KelvinMod {
4445
KELVINLOGGER.info("Initializing Kelvin...")
4546
networkManager = SimpleNetworkManager.create(MOD_ID)
4647

48+
KelvinParticles.init()
49+
4750
LifecycleEvent.SERVER_BEFORE_START.register {
4851
Kelvin.disabled = false
4952
KELVINLOGGER.info("Enabling Kelvin...")
@@ -113,6 +116,7 @@ object KelvinMod {
113116
KELVINLOGGER.info("Registering gas types...")
114117
GasTypeRegistry.init()
115118
ReactionRequirementRegistry.init()
119+
GasParticlePickerRegistry.init()
116120
KELVINLOGGER.info("--- --- ---")
117121
KELVINLOGGER.info("Finished registering gas types. We have ${GasTypeRegistry.GAS_TYPES.size} gasses registered!")
118122

@@ -121,6 +125,8 @@ object KelvinMod {
121125

122126
@JvmStatic
123127
fun initClient() {
128+
KelvinParticles.KelvinClientParticles.init()
129+
124130
ClientPlayerEvent.CLIENT_PLAYER_JOIN.register {
125131
if (Platform.getEnvironment() == Env.CLIENT) KelvinClient.disabled = false
126132
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.valkyrienskies.kelvin
2+
3+
import dev.architectury.registry.client.particle.ParticleProviderRegistry
4+
import dev.architectury.registry.registries.DeferredRegister
5+
import dev.architectury.registry.registries.RegistrySupplier
6+
import net.minecraft.core.Registry
7+
import org.valkyrienskies.kelvin.impl.client.particle.DefaultGasParticle.DefaultGasParticleType
8+
import org.valkyrienskies.kelvin.impl.client.particle.DefaultGasParticleProvider
9+
10+
11+
12+
object KelvinParticles {
13+
14+
val ALL: HashSet<RegistrySupplier<DefaultGasParticleType>> = HashSet()
15+
val PARTICLES = DeferredRegister.create(KelvinMod.MOD_ID, Registry.PARTICLE_TYPE_REGISTRY)
16+
17+
fun registerDefaultParticle(name: String): RegistrySupplier<DefaultGasParticleType> {
18+
val supplier = PARTICLES.register(name) { DefaultGasParticleType() }
19+
ALL.add(supplier)
20+
KelvinMod.KELVINLOGGER.info("Registered particle: ${supplier.id}")
21+
return supplier
22+
}
23+
24+
fun init() {
25+
KelvinMod.KELVINLOGGER.info("Registering Kelvin default gas particles...")
26+
PARTICLES.register()
27+
28+
}
29+
30+
object KelvinClientParticles {
31+
32+
fun registerDefaultParticle(supplier: RegistrySupplier<DefaultGasParticleType>) {
33+
ParticleProviderRegistry.register(supplier.get(), ::DefaultGasParticleProvider)
34+
}
35+
36+
fun init() {
37+
KelvinMod.KELVINLOGGER.info("Registering Kelvin default particle providers...")
38+
ALL.forEach { entry ->
39+
registerDefaultParticle(entry)
40+
KelvinMod.KELVINLOGGER.info("Registered particle provider: ${entry.id}")
41+
}
42+
43+
}
44+
45+
}
46+
}

common/src/main/kotlin/org/valkyrienskies/kelvin/api/DuctNetwork.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,12 @@
11
package org.valkyrienskies.kelvin.api
22

3-
import net.minecraft.resources.ResourceKey
43
import net.minecraft.resources.ResourceLocation
5-
import net.minecraft.server.level.ServerLevel
64
import net.minecraft.world.entity.player.Player
75
import net.minecraft.world.level.Level
86
import org.valkyrienskies.kelvin.KelvinMod.KELVINLOGGER
97
import org.valkyrienskies.kelvin.impl.DuctNodeInfo
108
import org.valkyrienskies.kelvin.impl.client.ClientKelvinInfo
119
import org.valkyrienskies.kelvin.util.KelvinChunkPos
12-
import java.util.EnumMap
13-
import java.util.logging.Logger
1410

1511
/**
1612
* The main class representing the Duct Network.
@@ -73,7 +69,6 @@ interface DuctNetwork<T: Level> {
7369
fun removeEdge(posA: DuctNodePos, posB: DuctNodePos) {
7470
KELVINLOGGER.warn("You can't modify this from here. Called: removeEdge")
7571
}
76-
7772
fun modTemperature(pos: DuctNodePos, deltaTemperature: Double) {
7873
KELVINLOGGER.warn("You can't modify this from here. Called: modTemperature")
7974
}
@@ -90,6 +85,8 @@ interface DuctNetwork<T: Level> {
9085
KELVINLOGGER.warn("You can't modify this from here. Called: modHeatEnergy")
9186
}
9287

88+
fun createGasParticle(level: T, gasType: GasType, pos: DuctNodePos, x: Double, y: Double, z: Double, xSpeed: Double, ySpeed: Double, zSpeed: Double)
89+
9390
// the real meat
9491
fun tick(level: T, subSteps: Int = 1)
9592

common/src/main/kotlin/org/valkyrienskies/kelvin/api/GasReaction.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ package org.valkyrienskies.kelvin.api
22

33
import com.google.gson.JsonElement
44

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

common/src/main/kotlin/org/valkyrienskies/kelvin/api/GasType.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ package org.valkyrienskies.kelvin.api
33
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
44
import com.fasterxml.jackson.databind.annotation.JsonSerialize
55
import net.minecraft.resources.ResourceLocation
6+
import org.valkyrienskies.kelvin.KelvinParticles
7+
import org.valkyrienskies.kelvin.impl.client.particle.DefaultGasParticlePicker
8+
import org.valkyrienskies.kelvin.impl.registry.ReactionRequirementRegistry
69
import org.valkyrienskies.kelvin.util.KelvinKeyMapper
710

811
@JsonSerialize(using = KelvinKeyMapper.GasTypeSerializer::class)
@@ -20,8 +23,10 @@ data class GasType(
2023
val calorificValue: Double = 0.0, // (J / kg) (see https://en.wikipedia.org/wiki/Energy_density), only use if [combustible] is true
2124
val iconLocation: ResourceLocation? = null
2225
) {
26+
2327
override fun toString(): String {
2428
val iconLoc = iconLocation?.toString() ?: "null"
2529
return "{$name, $density, $viscosity, $specificHeatCapacity, $thermalConductivity, $sutherlandConstant, $adiabaticIndex, $combustible, $calorificValue, $iconLoc}"
2630
}
31+
2732
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.valkyrienskies.kelvin.api
2+
3+
import net.minecraft.core.particles.ParticleOptions
4+
import net.minecraft.world.level.Level
5+
6+
/*
7+
A class for defining a ParticleTypePicker, which kelvin uses to pick out a ParticleType for anything it uses Particles for
8+
*/
9+
abstract class KelvinParticlePicker {
10+
abstract fun chooseParticleOptions(level: Level, ductNodePos: DuctNodePos): ParticleOptions
11+
}
12+

common/src/main/kotlin/org/valkyrienskies/kelvin/impl/DuctNetworkServer.kt

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import org.valkyrienskies.kelvin.api.DuctNetwork.Companion.idealGasConstant
1313
import org.valkyrienskies.kelvin.api.edges.*
1414
import org.valkyrienskies.kelvin.api.nodes.TankDuctNode
1515
import org.valkyrienskies.kelvin.impl.client.ClientKelvinInfo
16+
import org.valkyrienskies.kelvin.impl.registry.GasTypeRegistry
1617
import org.valkyrienskies.kelvin.networking.KelvinSyncPacket
1718
import org.valkyrienskies.kelvin.util.*
1819
import org.valkyrienskies.kelvin.util.KelvinExtensions.toChunkPos
@@ -220,6 +221,20 @@ class DuctNetworkServer(
220221

221222
}
222223

224+
override fun createGasParticle(
225+
level: ServerLevel,
226+
gasType: GasType,
227+
pos: DuctNodePos,
228+
x: Double,
229+
y: Double,
230+
z: Double,
231+
xSpeed: Double,
232+
ySpeed: Double,
233+
zSpeed: Double
234+
) {
235+
KELVINLOGGER.warn("Server can't add Particles.")
236+
}
237+
223238
override fun tick(level: ServerLevel, subSteps: Int) {
224239
if (disabled) return
225240

@@ -575,25 +590,22 @@ class DuctNetworkServer(
575590

576591
for (reaction in reactions.values) {
577592
var con = false
578-
reaction.requirements.forEach {if (!it.key.apply_requirement(level, node, this, it.value)) { con = true
579-
return@forEach
580-
}}
593+
reaction.requirements.forEach {if (!it.key.apply_requirement(level, node, this, it.value)) { con = true; return@forEach }}
581594
if (con) continue
582595

583596

584-
calcReaction(node, gasMasses, reaction.gasses, reaction.result)
597+
calcReaction(node, gasMasses, reaction.gasses, reaction.result, reaction.energy)
585598
}
586599
}
587600
}
588601

589-
private fun calcReaction(ductNodePos: DuctNodePos, gasMasses: HashMap<GasType, Double>, inputGasses: HashMap<GasType, Int>, outputGasses: HashMap<GasType, Int>) {
602+
private fun calcReaction(ductNodePos: DuctNodePos, gasMasses: HashMap<GasType, Double>, inputGasses: HashMap<GasType, Int>, outputGasses: HashMap<GasType, Int>, deltaEnergy: Double) {
590603
val gasMoles = HashMap<GasType, Double>()
591604

592605
for (gas in gasMasses) gasMoles[gas.key] = (gas.value/gas.key.density)/22.4
593606

594607
var reactionMoles = Double.MAX_VALUE
595608

596-
if (inputGasses.size == 0) return KELVINLOGGER.error("empty inputGasses in gas reaction.")
597609

598610
for (gas in inputGasses) {
599611
if (gas.key !in gasMoles || gasMoles[gas.key]!! < 0.001) return
@@ -606,6 +618,8 @@ class DuctNetworkServer(
606618

607619
for (gas in outputGasses) modGasMass(ductNodePos,gas.key,reactionMoles * gas.value * gas.key.density * 22.4)
608620

621+
modHeatEnergy(ductNodePos, deltaEnergy * reactionMoles)
622+
609623
}
610624

611625
/**

common/src/main/kotlin/org/valkyrienskies/kelvin/impl/KelvinReactionDataLoader.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import org.valkyrienskies.kelvin.KelvinMod.KELVINLOGGER
1010
import org.valkyrienskies.kelvin.api.GasReaction
1111
import org.valkyrienskies.kelvin.api.GasReactionRequirement
1212
import org.valkyrienskies.kelvin.api.GasType
13+
import org.valkyrienskies.kelvin.impl.registry.GasTypeRegistry
14+
import org.valkyrienskies.kelvin.impl.registry.ReactionRequirementRegistry
1315

1416
object KelvinReactionDataLoader {
1517
val gas_reactions = hashMapOf<ResourceLocation, GasReaction>()
@@ -22,7 +24,6 @@ object KelvinReactionDataLoader {
2224
resourceManager: ResourceManager,
2325
profiler: ProfilerFiller
2426
) {
25-
println("Applying Data loader")
2627
gas_reactions.clear()
2728
objects.forEach { (location, element) ->
2829
try {
@@ -76,9 +77,12 @@ object KelvinReactionDataLoader {
7677
result[gasType] = gasParts
7778
}
7879

79-
val parsed_reaction = GasReaction(gasses, requirements, result)
80-
println(parsed_reaction)
81-
gas_reactions[origin] = parsed_reaction
80+
81+
val energy = if (jObject.has("energy")) jObject["energy"].asDouble else 0.0
82+
83+
val parsedReaction = GasReaction(gasses = gasses, requirements = requirements, energy = energy, result = result)
84+
println(parsedReaction)
85+
gas_reactions[origin] = parsedReaction
8286

8387
}
8488
}

common/src/main/kotlin/org/valkyrienskies/kelvin/impl/client/DuctNetworkClient.kt

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@ import net.minecraft.world.entity.player.Player
66
import org.valkyrienskies.kelvin.KelvinMod.KELVINLOGGER
77
import org.valkyrienskies.kelvin.api.*
88
import org.valkyrienskies.kelvin.impl.DuctNodeInfo
9+
import org.valkyrienskies.kelvin.impl.registry.GasParticlePickerRegistry
910
import org.valkyrienskies.kelvin.networking.KelvinRequestChunkSyncPacket
1011
import org.valkyrienskies.kelvin.util.KelvinChunkPos
1112
import org.valkyrienskies.kelvin.util.KelvinExtensions.toChunkPos
12-
import java.util.*
1313
import kotlin.collections.HashMap
1414
import kotlin.collections.HashSet
15+
import kotlin.math.abs
1516

1617
class DuctNetworkClient: DuctNetwork<ClientLevel> {
1718

@@ -37,6 +38,13 @@ class DuctNetworkClient: DuctNetwork<ClientLevel> {
3738
override fun tick(level: ClientLevel, subSteps: Int) {
3839
if (disabled) return
3940

41+
nodeInfo.forEach { pos, node ->
42+
if (abs(node.currentPressure - node.previousPressure) > 1) {
43+
val largestGas = node.currentGasMasses.maxBy { (_, amount) -> amount }.key
44+
createGasParticle(level, largestGas, pos, pos.x, pos.y, pos.z, 0.0, 0.0, 0.0)
45+
}
46+
}
47+
4048
ticksSinceLastSync++
4149
}
4250

@@ -110,6 +118,16 @@ class DuctNetworkClient: DuctNetwork<ClientLevel> {
110118
nodeInfo.remove(pos)
111119
}
112120

121+
override fun createGasParticle(
122+
level: ClientLevel, gasType: GasType, pos: DuctNodePos,
123+
x: Double, y: Double, z: Double,
124+
xSpeed: Double, ySpeed: Double, zSpeed: Double
125+
) {
126+
val particleTypePicker = GasParticlePickerRegistry.getParticlePicker(gasType) ?: return KELVINLOGGER.error("${gasType.resourceLocation} lacks a ParticlePicker")
127+
val particleOptions = particleTypePicker.chooseParticleOptions(level, pos)
128+
level.addParticle(particleOptions, x, y, z, xSpeed, ySpeed, zSpeed)
129+
}
130+
113131
override fun getHeatEnergy(pos: DuctNodePos): Double {
114132
return getTemperatureAt(pos) * specificHeatAverage(getGasMassAt(pos)) * getGasMassAt(pos).values.sum()
115133
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.valkyrienskies.kelvin.impl.client.particle
2+
3+
import net.minecraft.client.multiplayer.ClientLevel
4+
import net.minecraft.client.particle.ParticleRenderType
5+
import net.minecraft.client.particle.TextureSheetParticle
6+
import net.minecraft.core.particles.SimpleParticleType
7+
8+
class DefaultGasParticle(level: ClientLevel, x: Double, y: Double, z: Double, xSpeed: Double, ySpeed: Double, zSpeed: Double): TextureSheetParticle(level, x, y, z, xSpeed, ySpeed, zSpeed) {
9+
10+
override fun getRenderType(): ParticleRenderType {
11+
return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT
12+
}
13+
14+
class DefaultGasParticleType : SimpleParticleType(false)
15+
}

0 commit comments

Comments
 (0)