Fix machines not getting capabilities

This commit is contained in:
DBotThePony 2024-08-30 17:25:09 +07:00
parent 859d72defb
commit 8551e2fa64
Signed by: DBot
GPG Key ID: DCC23B5715498507
2 changed files with 20 additions and 0 deletions

View File

@ -52,6 +52,7 @@ import ru.dbotthepony.mc.otm.core.util.TickList
import ru.dbotthepony.mc.otm.core.util.countingLazy import ru.dbotthepony.mc.otm.core.util.countingLazy
import ru.dbotthepony.mc.otm.network.BlockEntitySyncPacket import ru.dbotthepony.mc.otm.network.BlockEntitySyncPacket
import ru.dbotthepony.mc.otm.onceServer import ru.dbotthepony.mc.otm.onceServer
import ru.dbotthepony.mc.otm.registry.MBlocks
import ru.dbotthepony.mc.otm.sometimeServer import ru.dbotthepony.mc.otm.sometimeServer
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
import java.util.* import java.util.*
@ -124,6 +125,7 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
*/ */
protected fun <T : Any> exposeSideless(capability: BlockCapability<T, *>, value: T) { protected fun <T : Any> exposeSideless(capability: BlockCapability<T, *>, value: T) {
check(!sidelessCaps.containsKey(capability)) { "Already has globally exposed $capability!" } check(!sidelessCaps.containsKey(capability)) { "Already has globally exposed $capability!" }
MBlocks.ensureCapabilityIsKnown(capability)
sidelessCaps[capability] = value sidelessCaps[capability] = value
setChanged() setChanged()
level?.invalidateCapabilities(blockPos) level?.invalidateCapabilities(blockPos)
@ -132,6 +134,7 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
protected fun <T : Any> exposeSided(side: RelativeSide, capability: BlockCapability<T, *>, value: T) { protected fun <T : Any> exposeSided(side: RelativeSide, capability: BlockCapability<T, *>, value: T) {
val map = sidedCaps[side.ordinal] val map = sidedCaps[side.ordinal]
check(!map.containsKey(capability)) { "Already has exposed $capability on $side!" } check(!map.containsKey(capability)) { "Already has exposed $capability on $side!" }
MBlocks.ensureCapabilityIsKnown(capability)
map[capability] = value map[capability] = value
setChanged() setChanged()
level?.invalidateCapabilities(blockPos) level?.invalidateCapabilities(blockPos)

View File

@ -1,5 +1,6 @@
package ru.dbotthepony.mc.otm.registry package ru.dbotthepony.mc.otm.registry
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet
import net.minecraft.core.Direction import net.minecraft.core.Direction
import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.core.registries.BuiltInRegistries
import net.minecraft.util.valueproviders.UniformInt import net.minecraft.util.valueproviders.UniformInt
@ -19,6 +20,7 @@ import net.minecraft.world.level.material.MapColor
import net.minecraft.world.level.material.PushReaction import net.minecraft.world.level.material.PushReaction
import net.neoforged.bus.api.IEventBus import net.neoforged.bus.api.IEventBus
import net.neoforged.neoforge.capabilities.BlockCapability import net.neoforged.neoforge.capabilities.BlockCapability
import net.neoforged.neoforge.capabilities.Capabilities
import net.neoforged.neoforge.capabilities.IBlockCapabilityProvider import net.neoforged.neoforge.capabilities.IBlockCapabilityProvider
import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent
import ru.dbotthepony.mc.otm.block.BlackHoleBlock import ru.dbotthepony.mc.otm.block.BlackHoleBlock
@ -77,6 +79,7 @@ import ru.dbotthepony.mc.otm.block.tech.PlatePressBlock
import ru.dbotthepony.mc.otm.block.tech.PoweredBlastFurnaceBlock import ru.dbotthepony.mc.otm.block.tech.PoweredBlastFurnaceBlock
import ru.dbotthepony.mc.otm.block.tech.PoweredFurnaceBlock import ru.dbotthepony.mc.otm.block.tech.PoweredFurnaceBlock
import ru.dbotthepony.mc.otm.block.tech.PoweredSmokerBlock import ru.dbotthepony.mc.otm.block.tech.PoweredSmokerBlock
import ru.dbotthepony.mc.otm.capability.MatteryCapability
import ru.dbotthepony.mc.otm.config.CablesConfig import ru.dbotthepony.mc.otm.config.CablesConfig
import ru.dbotthepony.mc.otm.core.collect.SupplierList import ru.dbotthepony.mc.otm.core.collect.SupplierList
import ru.dbotthepony.mc.otm.core.collect.SupplierMap import ru.dbotthepony.mc.otm.core.collect.SupplierMap
@ -85,9 +88,23 @@ import java.util.function.Supplier
object MBlocks { object MBlocks {
private val registry = MDeferredRegister(BuiltInRegistries.BLOCK) private val registry = MDeferredRegister(BuiltInRegistries.BLOCK)
private val knownCaps = ObjectOpenHashSet<BlockCapability<*, *>>()
fun ensureCapabilityIsKnown(cap: BlockCapability<*, *>) {
check(cap in knownCaps) { "Tried to expose capability which wasn't known on mod startup. This is unfortunately limitation with new capability system and can not be fixed, unless NeoForge team decides to rethink their decision to remove per block(entity) dynamic capabilities." }
}
private fun registerCapabilities(event: RegisterCapabilitiesEvent) { private fun registerCapabilities(event: RegisterCapabilitiesEvent) {
// static initializers
MatteryCapability.BLOCK_ENERGY
Capabilities.FluidHandler.BLOCK
Capabilities.EnergyStorage.BLOCK
Capabilities.ItemHandler.BLOCK
// ugly // ugly
for (cap in BlockCapability.getAll()) { for (cap in BlockCapability.getAll()) {
knownCaps.add(cap)
val provider = IBlockCapabilityProvider<Any?, Direction?> { level, pos, state, be, context: Direction? -> val provider = IBlockCapabilityProvider<Any?, Direction?> { level, pos, state, be, context: Direction? ->
if (be is MatteryBlockEntity) { if (be is MatteryBlockEntity) {
return@IBlockCapabilityProvider be.getCapability(cap as BlockCapability<Any, Direction?>, context) return@IBlockCapabilityProvider be.getCapability(cap as BlockCapability<Any, Direction?>, context)