From 5af896e4761e2d21899077f2d5c3b4cc84dc2406 Mon Sep 17 00:00:00 2001
From: DBotThePony <dbotthepony@yandex.ru>
Date: Wed, 28 Aug 2024 18:18:01 +0700
Subject: [PATCH] Update FLUID_STACK component to use SimpleFluidContent

---
 .../capability/fluid/ItemMatteryFluidHandler.kt |  5 +++--
 .../mc/otm/item/matter/PatternStorageItem.kt    |  5 +++--
 .../mc/otm/registry/MDataComponentTypes.kt      | 17 +++++++++++------
 3 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/fluid/ItemMatteryFluidHandler.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/fluid/ItemMatteryFluidHandler.kt
index 4a9fc3428..fe66aeabb 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/fluid/ItemMatteryFluidHandler.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/fluid/ItemMatteryFluidHandler.kt
@@ -2,6 +2,7 @@ package ru.dbotthepony.mc.otm.capability.fluid
 
 import net.minecraft.world.item.ItemStack
 import net.neoforged.neoforge.fluids.FluidStack
+import net.neoforged.neoforge.fluids.SimpleFluidContent
 import net.neoforged.neoforge.fluids.capability.IFluidHandler
 import net.neoforged.neoforge.fluids.capability.IFluidHandlerItem
 import ru.dbotthepony.mc.otm.registry.MDataComponentTypes
@@ -12,8 +13,8 @@ import java.util.function.IntSupplier
  */
 open class ItemMatteryFluidHandler(val itemStack: ItemStack, private val _capacity: IntSupplier) : AbstractMatteryFluidHandler(), IFluidHandlerItem {
 	override var fluid: FluidStack
-		get() = itemStack[MDataComponentTypes.FLUID_STACK] ?: FluidStack.EMPTY
-		set(value) { itemStack[MDataComponentTypes.FLUID_STACK] = value }
+		get() = (itemStack[MDataComponentTypes.FLUID_STACK] ?: SimpleFluidContent.EMPTY).copy()
+		set(value) { itemStack[MDataComponentTypes.FLUID_STACK] = SimpleFluidContent.copyOf(value) }
 
 	final override val capacity: Int
 		get() = _capacity.asInt
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/PatternStorageItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/PatternStorageItem.kt
index 514561761..9bc8d5812 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/PatternStorageItem.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/PatternStorageItem.kt
@@ -1,5 +1,6 @@
 package ru.dbotthepony.mc.otm.item.matter
 
+import com.google.common.collect.ImmutableList
 import net.minecraft.ChatFormatting
 import net.minecraft.network.chat.Component
 import net.minecraft.world.item.Item
@@ -119,7 +120,7 @@ class PatternStorageItem : Item, CapabilitiesRegisterListener {
 					}
 
 					patterns[i] = pattern
-					stack[MDataComponentTypes.PATTERNS] = patterns
+					stack[MDataComponentTypes.PATTERNS] = ImmutableList.copyOf(patterns)
 					return PatternInsertUpdated(pattern, ePattern)
 				}
 			}
@@ -129,7 +130,7 @@ class PatternStorageItem : Item, CapabilitiesRegisterListener {
 
 			if (!simulate) {
 				patterns.add(pattern)
-				stack[MDataComponentTypes.PATTERNS] = patterns
+				stack[MDataComponentTypes.PATTERNS] = ImmutableList.copyOf(patterns)
 			}
 
 			return PatternInsertInserted(pattern)
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MDataComponentTypes.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MDataComponentTypes.kt
index 358bc7a4f..c015eca46 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MDataComponentTypes.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MDataComponentTypes.kt
@@ -1,5 +1,6 @@
 package ru.dbotthepony.mc.otm.registry
 
+import com.google.common.collect.ImmutableList
 import com.mojang.serialization.Codec
 import net.minecraft.core.UUIDUtil
 import net.minecraft.core.component.DataComponentType
@@ -8,6 +9,7 @@ import net.minecraft.network.RegistryFriendlyByteBuf
 import net.minecraft.network.codec.StreamCodec
 import net.neoforged.bus.api.IEventBus
 import net.neoforged.neoforge.fluids.FluidStack
+import net.neoforged.neoforge.fluids.SimpleFluidContent
 import ru.dbotthepony.mc.otm.capability.matter.PatternState
 import ru.dbotthepony.mc.otm.container.ItemFilter
 import ru.dbotthepony.mc.otm.core.math.Decimal
@@ -30,13 +32,13 @@ object MDataComponentTypes {
 	}
 
 	val FLUID_STACK by registry.register("fluid_stack") {
-		object : DataComponentType<FluidStack> {
-			override fun codec(): Codec<FluidStack> {
-				return FluidStack.OPTIONAL_CODEC
+		object : DataComponentType<SimpleFluidContent> {
+			override fun codec(): Codec<SimpleFluidContent> {
+				return SimpleFluidContent.CODEC
 			}
 
-			override fun streamCodec(): StreamCodec<in RegistryFriendlyByteBuf, FluidStack> {
-				return FluidStack.OPTIONAL_STREAM_CODEC
+			override fun streamCodec(): StreamCodec<in RegistryFriendlyByteBuf, SimpleFluidContent> {
+				return SimpleFluidContent.STREAM_CODEC
 			}
 		}
 	}
@@ -53,7 +55,10 @@ object MDataComponentTypes {
 	val EXOPACK_UPGRADE_ID: DataComponentType<UUID> by registry.register("exopack_upgrade_id") { uuid() }
 	val QUANTUM_LINK_ID: DataComponentType<UUID> by registry.register("quantum_link_id") { uuid() }
 	val CONDENSATION_DRIVE_UUID: DataComponentType<UUID> by registry.register("condensation_drive_uuid") { uuid() }
-	val PATTERNS: DataComponentType<List<PatternState>> by registry.register("patterns") { DataComponentType.builder<List<PatternState>>().persistent(Codec.list(PatternState.CODEC)).build() }
+	val PATTERNS: DataComponentType<ImmutableList<PatternState>> by registry.register("patterns") {
+		DataComponentType.builder<ImmutableList<PatternState>>().persistent(Codec.list(PatternState.CODEC).xmap({ ImmutableList.copyOf(it) }, { it })).build()
+	}
+
 	val ITEM_FILTER: DataComponentType<ItemFilter> by registry.register("item_filter") { DataComponentType.builder<ItemFilter>().persistent(ItemFilter.CODEC).build() }
 
 	val EXPERIENCE: DataComponentType<Long> by registry.register("experience") { DataComponentType.builder<Long>().persistent(Codec.LONG).networkSynchronized(StreamCodecs.LONG).build() }