From 23f02036b998f7b44917d8f0e4878bad75fd5938 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Sat, 10 Aug 2024 10:37:47 +0700 Subject: [PATCH] Update quantum battery item --- .../mc/otm/item/QuantumBatteryItem.kt | 86 ++++++++----------- .../mc/otm/registry/MDataComponentTypes.kt | 7 +- 2 files changed, 42 insertions(+), 51 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt index fe3d2605f..3af787711 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt @@ -3,7 +3,8 @@ package ru.dbotthepony.mc.otm.item import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet import net.minecraft.ChatFormatting -import net.minecraft.core.Direction +import net.minecraft.core.HolderLookup +import net.minecraft.core.HolderLookup.Provider import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.nbt.CompoundTag import net.minecraft.network.FriendlyByteBuf @@ -15,16 +16,12 @@ import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack import net.minecraft.world.item.Rarity import net.minecraft.world.item.TooltipFlag -import net.minecraft.world.level.Level import net.minecraft.world.level.saveddata.SavedData -import net.minecraftforge.client.event.ClientPlayerNetworkEvent -import net.minecraftforge.common.capabilities.Capability -import net.minecraftforge.common.capabilities.ForgeCapabilities -import net.minecraftforge.common.capabilities.ICapabilityProvider -import net.minecraftforge.common.util.LazyOptional -import net.minecraftforge.event.TickEvent -import net.minecraftforge.event.TickEvent.ServerTickEvent -import net.minecraftforge.registries.ForgeRegistries +import net.neoforged.neoforge.capabilities.Capabilities +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent +import net.neoforged.neoforge.client.event.ClientPlayerNetworkEvent +import net.neoforged.neoforge.event.tick.ServerTickEvent +import net.neoforged.neoforge.network.PacketDistributor import net.neoforged.neoforge.network.handling.IPayloadContext import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.capability.FlowDirection @@ -38,8 +35,6 @@ import ru.dbotthepony.mc.otm.config.EnergyBalanceValues import ru.dbotthepony.mc.otm.core.ResourceLocation import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.collect.filter -import ru.dbotthepony.mc.otm.core.getID -import ru.dbotthepony.mc.otm.core.getValue import ru.dbotthepony.mc.otm.core.isNotEmpty import ru.dbotthepony.mc.otm.core.math.Decimal import ru.dbotthepony.mc.otm.core.math.getDecimal @@ -48,16 +43,14 @@ import ru.dbotthepony.mc.otm.core.math.set import ru.dbotthepony.mc.otm.core.math.writeDecimal import ru.dbotthepony.mc.otm.core.nbt.getUUIDSafe import ru.dbotthepony.mc.otm.core.nbt.set -import ru.dbotthepony.mc.otm.core.orThrow -import ru.dbotthepony.mc.otm.core.tagNotNull import ru.dbotthepony.mc.otm.core.util.formatPower import ru.dbotthepony.mc.otm.isClientThread import ru.dbotthepony.mc.otm.isServerThread import ru.dbotthepony.mc.otm.lazyPerServer -import ru.dbotthepony.mc.otm.network.MatteryPacket +import ru.dbotthepony.mc.otm.registry.CapabilitiesRegisterListener +import ru.dbotthepony.mc.otm.registry.MDataComponentTypes import java.util.* import java.util.function.Function -import java.util.function.Supplier import kotlin.collections.MutableList import kotlin.collections.component1 import kotlin.collections.component2 @@ -65,7 +58,7 @@ import kotlin.collections.forEach import kotlin.collections.iterator import kotlin.collections.set -class QuantumBatteryItem(val savedataID: String, val balanceValues: EnergyBalanceValues?) : Item(Properties().stacksTo(1).rarity(if (balanceValues == null) Rarity.EPIC else Rarity.UNCOMMON)), IQuantumLinked { +class QuantumBatteryItem(val savedataID: String, val balanceValues: EnergyBalanceValues?) : Item(Properties().stacksTo(1).rarity(if (balanceValues == null) Rarity.EPIC else Rarity.UNCOMMON)), IQuantumLinked, CapabilitiesRegisterListener { val isCreative = balanceValues == null interface IValues { @@ -99,7 +92,7 @@ class QuantumBatteryItem(val savedataID: String, val balanceValues: EnergyBalanc } class Data() : SavedData() { - constructor(nbt: CompoundTag) : this() { + constructor(nbt: CompoundTag, registry: Provider) : this() { load(nbt) } @@ -136,7 +129,7 @@ class QuantumBatteryItem(val savedataID: String, val balanceValues: EnergyBalanc return values(UUID.randomUUID()) } - override fun save(nbt: CompoundTag): CompoundTag { + override fun save(nbt: CompoundTag, registry: HolderLookup.Provider): CompoundTag { for ((key, values) in data) { nbt[key.toString()] = values.serialize() } @@ -160,9 +153,7 @@ class QuantumBatteryItem(val savedataID: String, val balanceValues: EnergyBalanc it.overworld().dataStorage.computeIfAbsent(SavedData.Factory(::Data, ::Data, DataFixTypes.SAVED_DATA_MAP_DATA), "otm_$savedataID") } - private inner class Power(private val stack: ItemStack) : IMatteryEnergyStorage, ICapabilityProvider { - private val resolver = LazyOptional.of { this } - + private inner class Power(private val stack: ItemStack) : IMatteryEnergyStorage { override val energyFlow: FlowDirection get() = FlowDirection.BI_DIRECTIONAL @@ -170,23 +161,15 @@ class QuantumBatteryItem(val savedataID: String, val balanceValues: EnergyBalanc fun updateValues() { if (!values.isServer && isServerThread()) { - values = serverData.values(stack.tag?.getUUIDSafe("uuid") ?: UUID.randomUUID().also { stack.tagNotNull["uuid"] = it }) + values = serverData.values(stack[MDataComponentTypes.QUANTUM_LINK_ID] ?: UUID.randomUUID().also { stack[MDataComponentTypes.QUANTUM_LINK_ID] = it }) } else if (isClientThread()) { - val id = stack.tag?.getUUIDSafe("uuid") ?: return + val id = stack[MDataComponentTypes.QUANTUM_LINK_ID] ?: return if (values.uuid != id) values = clientData.computeIfAbsent(id, Function { UnboundValues(it) }) } } - override fun getCapability(cap: Capability, side: Direction?): LazyOptional { - if (cap == ForgeCapabilities.ENERGY || cap == MatteryCapability.ENERGY) { - return resolver.cast() - } - - return LazyOptional.empty() - } - override fun extractEnergy(howMuch: Decimal, simulate: Boolean): Decimal { if (!howMuch.isPositive) return Decimal.ZERO @@ -296,14 +279,20 @@ class QuantumBatteryItem(val savedataID: String, val balanceValues: EnergyBalanc return p_150901_.matteryEnergy?.getBarColor() ?: super.getBarColor(p_150901_) } - override fun initCapabilities(stack: ItemStack, nbt: CompoundTag?): ICapabilityProvider { - return Power(stack) + override fun registerCapabilities(event: RegisterCapabilitiesEvent) { + event.registerItem(Capabilities.EnergyStorage.ITEM, { o, _ -> Power(o) }, this) + event.registerItem(MatteryCapability.ITEM_ENERGY, { o, _ -> Power(o) }, this) } - override fun appendHoverText(itemStack: ItemStack, level: Level?, components: MutableList, flags: TooltipFlag) { - super.appendHoverText(itemStack, level, components, flags) + override fun appendHoverText( + itemStack: ItemStack, + context: TooltipContext, + components: MutableList, + flags: TooltipFlag + ) { + super.appendHoverText(itemStack, context, components, flags) - val power = itemStack.getCapability(MatteryCapability.ENERGY).orThrow() as Power + val power = itemStack.getCapability(MatteryCapability.ITEM_ENERGY) as Power power.updateValues() components.add(TranslatableComponent("otm.item.quantum_description").withStyle(ChatFormatting.DARK_GRAY)) @@ -328,12 +317,12 @@ class QuantumBatteryItem(val savedataID: String, val balanceValues: EnergyBalanc companion object { fun clientDisconnect(event: ClientPlayerNetworkEvent.LoggingOut) { - ForgeRegistries.ITEMS.values.forEach { if (it is QuantumBatteryItem) it.clientData.clear() } + BuiltInRegistries.ITEM.forEach { if (it is QuantumBatteryItem) it.clientData.clear() } } fun readPacket(buff: FriendlyByteBuf): ChargePacket { return ChargePacket( - ForgeRegistries.ITEMS.getValue(buff.readInt()) as QuantumBatteryItem, + BuiltInRegistries.ITEM.byId(buff.readInt()) as QuantumBatteryItem, buff.readUUID(), buff.readDecimal(), buff.readDecimal(), @@ -341,17 +330,16 @@ class QuantumBatteryItem(val savedataID: String, val balanceValues: EnergyBalanc ) } - fun tick(event: ServerTickEvent) { - if (event.phase == TickEvent.Phase.END) { - for (ply in event.server.playerList.players) { - val networkedChannels = ObjectOpenHashSet(0) + fun tick(event: ServerTickEvent.Post) { + for (ply in event.server.playerList.players) { + val networkedChannels = ObjectOpenHashSet(0) - for (item in ply.trackedItems().filter { it.isNotEmpty && it.item is QuantumBatteryItem }) { - val power = item.getCapability(MatteryCapability.ENERGY).orThrow() as Power - power.updateValues() - if (power.values.isServer && networkedChannels.add(power.values.uuid)) { - GenericNetworkChannel.send(ply, ChargePacket(item.item as QuantumBatteryItem, power.values.uuid, power.batteryLevel, power.passed, power.received)) - } + for (item in ply.trackedItems().filter { it.isNotEmpty && it.item is QuantumBatteryItem }) { + val power = item.getCapability(MatteryCapability.ITEM_ENERGY) as Power + power.updateValues() + + if (power.values.isServer && networkedChannels.add(power.values.uuid)) { + PacketDistributor.sendToPlayer(ply, ChargePacket(item.item as QuantumBatteryItem, power.values.uuid, power.batteryLevel, power.passed, power.received)) } } } 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 b7bd1a49c..fe7fd3a45 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MDataComponentTypes.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MDataComponentTypes.kt @@ -41,6 +41,8 @@ object MDataComponentTypes { } } + private fun uuid() = DataComponentType.builder().persistent(UUIDUtil.CODEC).networkSynchronized(UUIDUtil.STREAM_CODEC).build() + val BATTERY_LEVEL: DataComponentType by registry.register("battery_level") { DecimalComponent() } val MAX_BATTERY_LEVEL: DataComponentType by registry.register("max_battery_level") { DecimalComponent() } val MAX_BATTERY_INPUT: DataComponentType by registry.register("max_battery_input") { DecimalComponent() } @@ -48,8 +50,9 @@ object MDataComponentTypes { val MATTER_LEVEL: DataComponentType by registry.register("matter_level") { DecimalComponent() } val EXOPACK_SLOT_COUNT: DataComponentType by registry.register("exopack_slot_count") { DataComponentType.builder().persistent(Codec.INT).networkSynchronized(StreamCodecs.INT).build() } - val EXOPACK_UPGRADE_UUID: DataComponentType by registry.register("exopack_upgrade_uuid") { DataComponentType.builder().persistent(UUIDUtil.CODEC).networkSynchronized(UUIDUtil.STREAM_CODEC).build() } - val CONDENSATION_DRIVE_UUID: DataComponentType by registry.register("condensation_drive_uuid") { DataComponentType.builder().persistent(UUIDUtil.CODEC).networkSynchronized(UUIDUtil.STREAM_CODEC).build() } + val EXOPACK_UPGRADE_ID: DataComponentType by registry.register("exopack_upgrade_id") { uuid() } + val QUANTUM_LINK_ID: DataComponentType by registry.register("quantum_link_id") { uuid() } + val CONDENSATION_DRIVE_UUID: DataComponentType by registry.register("condensation_drive_uuid") { uuid() } val PATTERNS: DataComponentType> by registry.register("patterns") { DataComponentType.builder>().persistent(Codec.list(PatternState.CODEC)).build() } val ITEM_FILTER: DataComponentType by registry.register("item_filter") { DataComponentType.builder().persistent(ItemFilter.CODEC).build() }