diff --git a/src/main/java/de/bixilon/minosoft/data/registries/fluid/FluidRegistry.kt b/src/main/java/de/bixilon/minosoft/data/registries/fluid/FluidRegistry.kt
new file mode 100644
index 000000000..80ae45d39
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/data/registries/fluid/FluidRegistry.kt
@@ -0,0 +1,35 @@
+/*
+ * Minosoft
+ * Copyright (C) 2020-2023 Moritz Zwerger
+ *
+ * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with this program. If not, see .
+ *
+ * This software is not affiliated with Mojang AB, the original developer of Minecraft.
+ */
+
+package de.bixilon.minosoft.data.registries.fluid
+
+import de.bixilon.minosoft.data.registries.fluid.fluids.LavaFluid
+import de.bixilon.minosoft.data.registries.fluid.fluids.PixLyzerFluid
+import de.bixilon.minosoft.data.registries.fluid.fluids.WaterFluid
+import de.bixilon.minosoft.data.registries.registries.Registries
+import de.bixilon.minosoft.data.registries.registries.registry.Registry
+
+class FluidRegistry : Registry(codec = PixLyzerFluid, integrated = FluidFactories) {
+ // yep, bad design, but physics heavy rely on them atm, boosting performance a lot
+ var water: Fluid? = null
+ var lava: Fluid? = null
+
+ fun updateWaterLava() {
+ water = this[WaterFluid]
+ lava = this[LavaFluid]
+ }
+
+ override fun postInit(registries: Registries) {
+ updateWaterLava()
+ }
+}
diff --git a/src/main/java/de/bixilon/minosoft/data/registries/registries/Registries.kt b/src/main/java/de/bixilon/minosoft/data/registries/registries/Registries.kt
index e80e735f8..13d04da24 100644
--- a/src/main/java/de/bixilon/minosoft/data/registries/registries/Registries.kt
+++ b/src/main/java/de/bixilon/minosoft/data/registries/registries/Registries.kt
@@ -43,9 +43,7 @@ import de.bixilon.minosoft.data.registries.entities.damage.DamageType
import de.bixilon.minosoft.data.registries.entities.variants.CatVariant
import de.bixilon.minosoft.data.registries.entities.variants.FrogVariant
import de.bixilon.minosoft.data.registries.entities.villagers.VillagerProfession
-import de.bixilon.minosoft.data.registries.fluid.Fluid
-import de.bixilon.minosoft.data.registries.fluid.FluidFactories
-import de.bixilon.minosoft.data.registries.fluid.fluids.PixLyzerFluid
+import de.bixilon.minosoft.data.registries.fluid.FluidRegistry
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
import de.bixilon.minosoft.data.registries.item.ItemRegistry
import de.bixilon.minosoft.data.registries.materials.Material
@@ -89,7 +87,7 @@ class Registries(
val biome: Registry = register("biome", Registry(codec = Biome))
val dimension: Registry = register("dimension_type", Registry(codec = Dimension))
val material: Registry = register("material", Registry(codec = Material))
- val fluid: Registry = register("fluid", Registry(codec = PixLyzerFluid, integrated = FluidFactories))
+ val fluid: FluidRegistry = register("fluid", FluidRegistry())
val soundEvent: ResourceLocationRegistry = register("sound_event", ResourceLocationRegistry())
val recipes = RecipeRegistry()
diff --git a/src/main/java/de/bixilon/minosoft/physics/submersion/SubmersionState.kt b/src/main/java/de/bixilon/minosoft/physics/submersion/SubmersionState.kt
index b00fd199b..5aeeb357c 100644
--- a/src/main/java/de/bixilon/minosoft/physics/submersion/SubmersionState.kt
+++ b/src/main/java/de/bixilon/minosoft/physics/submersion/SubmersionState.kt
@@ -35,7 +35,6 @@ import de.bixilon.minosoft.data.world.positions.ChunkPositionUtil.inChunkPositio
import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.EMPTY
-import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.blockPosition
import de.bixilon.minosoft.physics.VanillaMath.vanillaNormalizeAssign
import de.bixilon.minosoft.physics.entities.EntityPhysics
import de.bixilon.minosoft.physics.properties.SwimmingVehicle
@@ -107,7 +106,8 @@ class SubmersionState(private val physics: EntityPhysics<*>) : Tickable {
physics.velocity = physics.velocity + update.velocity
}
- private fun update(fluid: Fluid, aabb: AABB, pushable: Boolean, previousHeight: Double) {
+ private fun update(fluid: Fluid?, aabb: AABB, pushable: Boolean, previousHeight: Double) {
+ if (fluid == null) return
val update = getFluidUpdate(fluid, aabb, pushable)
if (update == null) {
@@ -130,11 +130,13 @@ class SubmersionState(private val physics: EntityPhysics<*>) : Tickable {
}
}
+ @Deprecated("performance")
private fun update(type: ResourceLocation, aabb: AABB, pushable: Boolean, previousHeight: Double) {
- val fluid = physics.entity.connection.registries.fluid[type] ?: return // TODO: remove this and stream fluids: waterlogged makes problems
+ val fluid = physics.entity.connection.registries.fluid[type] // TODO: remove this and stream fluids: waterlogged makes problems
update(fluid, aabb, pushable, previousHeight)
}
+ @Deprecated("performance")
private fun update(type: Identified, aabb: AABB, pushable: Boolean, previous: Double) = update(type.identifier, aabb, pushable, previous)
private fun updateWaterSubmersion() {
@@ -146,11 +148,12 @@ class SubmersionState(private val physics: EntityPhysics<*>) : Tickable {
if (vehicle is Boat) {
// TODO
}
- val eyePosition = Vec3d(physics.position.x, eyeHeight, physics.position.z).blockPosition
- val block = world[eyePosition] ?: return
+ val position = physics.position
+ val block = physics.positionInfo.chunk?.get(position.x.toInt() and 0x0F, position.y.toInt(), position.z.toInt() and 0x0F) ?: return
if (block.block !is FluidHolder) {
return
}
+ val eyePosition = Vec3i(physics.position.x.toInt(), eyeHeight.toInt(), physics.position.z.toInt())
val fluidHeight = eyePosition.y + getFluidHeight(eyePosition, block, block.block.fluid)
if (fluidHeight > eyeHeight) {
@@ -164,11 +167,11 @@ class SubmersionState(private val physics: EntityPhysics<*>) : Tickable {
if (vehicle is SwimmingVehicle && !vehicle.canUpdatePassengerFluidMovement(WaterFluid)) {
return
}
- update(WaterFluid, aabb, pushable, previous)
+ update(physics.entity.connection.registries.fluid.water, aabb, pushable, previous)
}
private fun clear() {
- this.heights = Object2DoubleOpenHashMap()
+ this.heights = Object2DoubleOpenHashMap(0)
primaryFluid = null
}
@@ -180,7 +183,7 @@ class SubmersionState(private val physics: EntityPhysics<*>) : Tickable {
val pushable = physics.fluidPushable
updateWater(aabb, pushable, previous.getDouble(WaterFluid))
- update(LavaFluid, aabb, pushable, previous.getDouble(LavaFluid))
+ update(physics.entity.connection.registries.fluid.lava, aabb, pushable, previous.getDouble(LavaFluid))
}
override fun tick() {
diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt
index 013b52a2a..92d5d5561 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt
@@ -189,6 +189,7 @@ class PlayConnection(
taskWorker += {
events.fire(RegistriesLoadEvent(this, registries, RegistriesLoadEvent.States.PRE))
registries.parent = version.load(profiles.resources, latch.child(0))
+ registries.fluid.updateWaterLava()
events.fire(RegistriesLoadEvent(this, registries, RegistriesLoadEvent.States.POST))
this::legacyTags.forceSet(FallbackTags.map(registries))
}