New matter registry is now functional in multiplayer

yippie
This commit is contained in:
DBotThePony 2022-11-18 00:03:28 +07:00
parent 6dafff0bf4
commit a405d396ca
Signed by: DBot
GPG Key ID: DCC23B5715498507
5 changed files with 86 additions and 24 deletions

View File

@ -171,6 +171,7 @@ public final class OverdriveThatMatters {
EVENT_BUS.addListener(EventPriority.NORMAL, MatterManager.INSTANCE::reloadEvent); EVENT_BUS.addListener(EventPriority.NORMAL, MatterManager.INSTANCE::reloadEvent);
EVENT_BUS.addListener(EventPriority.NORMAL, MatterManager.INSTANCE::onServerStarted); EVENT_BUS.addListener(EventPriority.NORMAL, MatterManager.INSTANCE::onServerStarted);
EVENT_BUS.addListener(EventPriority.NORMAL, MatterManager.INSTANCE::onDataPackSync);
EVENT_BUS.addListener(EventPriority.NORMAL, MatterManager.INSTANCE::addCommands); EVENT_BUS.addListener(EventPriority.NORMAL, MatterManager.INSTANCE::addCommands);
EVENT_BUS.addListener(EventPriority.NORMAL, SynchronizedBlockEntity.Companion::onServerStopping); EVENT_BUS.addListener(EventPriority.NORMAL, SynchronizedBlockEntity.Companion::onServerStopping);

View File

@ -31,16 +31,16 @@ class CreativePatternItem : Item(Properties().rarity(Rarity.EPIC).tab(OverdriveT
private val resolver = LazyOptional.of<IPatternStorage> { this } private val resolver = LazyOptional.of<IPatternStorage> { this }
override val patterns: Stream<out IPatternState> override val patterns: Stream<out IPatternState>
get() = MatterManager.valuesList.stream().map { PatternState(UUID(34783464838L, 4463458382L + ForgeRegistries.ITEMS.getID(it.first)), it.first, 1.0) } get() = MatterManager.map.keys.stream().map { PatternState(UUID(34783464838L, 4463458382L + ForgeRegistries.ITEMS.getID(it)), it, 1.0) }
override val patternCapacity: Int override val patternCapacity: Int
get() { get() {
return MatterManager.valuesList.size return MatterManager.map.size
} }
override val storedPatterns: Int override val storedPatterns: Int
get() { get() {
return MatterManager.valuesList.size return MatterManager.map.size
} }
override fun insertPattern( override fun insertPattern(

View File

@ -1,6 +1,9 @@
package ru.dbotthepony.mc.otm.matter package ru.dbotthepony.mc.otm.matter
import net.minecraft.network.FriendlyByteBuf
import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.ImpreciseFraction
import ru.dbotthepony.mc.otm.core.readImpreciseFraction
import ru.dbotthepony.mc.otm.core.writeImpreciseFraction
interface IMatterValue : Comparable<IMatterValue> { interface IMatterValue : Comparable<IMatterValue> {
val matter: ImpreciseFraction val matter: ImpreciseFraction
@ -37,6 +40,23 @@ interface IMatterValue : Comparable<IMatterValue> {
} }
} }
fun FriendlyByteBuf.writeMatterValue(value: IMatterValue) {
writeImpreciseFraction(value.matter)
writeDouble(value.complexity)
}
fun FriendlyByteBuf.readMatterValue(): IMatterValue {
val matter = readImpreciseFraction()
val complexity = readDouble()
if (matter.isZero && complexity == 0.0) {
return IMatterValue.Companion
} else {
return MatterValue(matter, complexity)
}
}
data class MatterValue( data class MatterValue(
override val matter: ImpreciseFraction, override val matter: ImpreciseFraction,
override val complexity: Double override val complexity: Double

View File

@ -18,6 +18,7 @@ import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet
import net.minecraft.ChatFormatting import net.minecraft.ChatFormatting
import net.minecraft.commands.CommandSourceStack import net.minecraft.commands.CommandSourceStack
import net.minecraft.commands.Commands import net.minecraft.commands.Commands
import net.minecraft.network.FriendlyByteBuf
import net.minecraft.network.chat.Component import net.minecraft.network.chat.Component
import net.minecraft.network.chat.MutableComponent import net.minecraft.network.chat.MutableComponent
import net.minecraft.resources.ResourceKey import net.minecraft.resources.ResourceKey
@ -34,11 +35,14 @@ import net.minecraft.world.item.crafting.Recipe
import net.minecraft.world.item.crafting.RecipeType import net.minecraft.world.item.crafting.RecipeType
import net.minecraft.world.level.ItemLike import net.minecraft.world.level.ItemLike
import net.minecraftforge.event.AddReloadListenerEvent import net.minecraftforge.event.AddReloadListenerEvent
import net.minecraftforge.event.OnDatapackSyncEvent
import net.minecraftforge.event.RegisterCommandsEvent import net.minecraftforge.event.RegisterCommandsEvent
import net.minecraftforge.event.entity.player.ItemTooltipEvent import net.minecraftforge.event.entity.player.ItemTooltipEvent
import net.minecraftforge.event.server.ServerStartedEvent import net.minecraftforge.event.server.ServerStartedEvent
import net.minecraftforge.eventbus.api.IEventBus import net.minecraftforge.eventbus.api.IEventBus
import net.minecraftforge.fml.ModList import net.minecraftforge.fml.ModList
import net.minecraftforge.network.NetworkEvent
import net.minecraftforge.network.PacketDistributor
import net.minecraftforge.registries.DeferredRegister import net.minecraftforge.registries.DeferredRegister
import net.minecraftforge.registries.ForgeRegistries import net.minecraftforge.registries.ForgeRegistries
import net.minecraftforge.server.command.EnumArgument import net.minecraftforge.server.command.EnumArgument
@ -61,14 +65,18 @@ import ru.dbotthepony.mc.otm.core.formatSiComponent
import ru.dbotthepony.mc.otm.core.isActuallyEmpty import ru.dbotthepony.mc.otm.core.isActuallyEmpty
import ru.dbotthepony.mc.otm.core.isZero import ru.dbotthepony.mc.otm.core.isZero
import ru.dbotthepony.mc.otm.core.orNull import ru.dbotthepony.mc.otm.core.orNull
import ru.dbotthepony.mc.otm.core.readItemType
import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.core.registryName
import ru.dbotthepony.mc.otm.core.stream import ru.dbotthepony.mc.otm.core.stream
import ru.dbotthepony.mc.otm.isServerThread import ru.dbotthepony.mc.otm.core.writeItemType
import ru.dbotthepony.mc.otm.network.MatteryPacket
import ru.dbotthepony.mc.otm.network.RegistryNetworkChannel
import ru.dbotthepony.mc.otm.registry.RegistryDelegate import ru.dbotthepony.mc.otm.registry.RegistryDelegate
import ru.dbotthepony.mc.otm.storage.ItemStackWrapper import ru.dbotthepony.mc.otm.storage.ItemStackWrapper
import java.io.File import java.io.File
import java.math.BigInteger import java.math.BigInteger
import java.util.* import java.util.*
import java.util.function.Supplier
import java.util.stream.Stream import java.util.stream.Stream
import kotlin.ConcurrentModificationException import kotlin.ConcurrentModificationException
import kotlin.collections.ArrayDeque import kotlin.collections.ArrayDeque
@ -1198,10 +1206,8 @@ object MatterManager {
} }
private val matterValues = Reference2ObjectOpenHashMap<Item, IMatterValue>() private val matterValues = Reference2ObjectOpenHashMap<Item, IMatterValue>()
private val validMatterValues = ArrayList<Pair<Item, IMatterValue>>()
val valuesMap: Map<Item, IMatterValue> = Collections.unmodifiableMap(matterValues) val map: Map<Item, IMatterValue> = Collections.unmodifiableMap(matterValues)
val valuesList: List<Pair<Item, IMatterValue>> = Collections.unmodifiableList(validMatterValues)
private var registryIsBuilt = false private var registryIsBuilt = false
@ -1214,21 +1220,29 @@ object MatterManager {
registryIsBuilt = true registryIsBuilt = true
synchronized(matterValues) { commentary.clear()
commentary.clear() matterValues.clear()
matterValues.clear()
validMatterValues.clear()
Resolver.resolve(server) Resolver.resolve(server)
for (item in ForgeRegistries.ITEMS) { for (item in ForgeRegistries.ITEMS) {
val value = compute(item).value ?: IMatterValue.Companion val value = compute(item).value
if (value?.hasMatterValue == true)
matterValues[item] = value matterValues[item] = value
}
if (value.hasMatterValue) { RegistryNetworkChannel.send(PacketDistributor.ALL.noArg(), SyncPacket(matterValues, commentary))
validMatterValues.add(item to value) }
}
} fun onDataPackSync(event: OnDatapackSyncEvent) {
if (!registryIsBuilt)
return
if (event.player == null) {
RegistryNetworkChannel.send(PacketDistributor.ALL.noArg(), SyncPacket(matterValues, commentary))
} else {
RegistryNetworkChannel.send(PacketDistributor.PLAYER.with { event.player ?: throw ConcurrentModificationException() }, SyncPacket(matterValues, commentary))
} }
} }
@ -1239,12 +1253,37 @@ object MatterManager {
} }
fun get(value: Item): IMatterValue { fun get(value: Item): IMatterValue {
if (SERVER_IS_LIVE && !isServerThread()) { return matterValues[value] ?: IMatterValue.Companion
synchronized(matterValues) { // /reload }
return matterValues[value] ?: throw ConcurrentModificationException("${value.registryName} has no matter value in registry, this should be impossible")
fun readSyncPacket(buff: FriendlyByteBuf): SyncPacket {
return SyncPacket(
buff.readMap(FriendlyByteBuf::readItemType, FriendlyByteBuf::readMatterValue),
buff.readMap(FriendlyByteBuf::readItemType) { self -> self.readCollection(::ArrayList, FriendlyByteBuf::readComponent) }
)
}
class SyncPacket(
val values: Map<Item, IMatterValue>,
val comments: Map<Item, Collection<Component>>
) : MatteryPacket {
override fun write(buff: FriendlyByteBuf) {
buff.writeMap(values, FriendlyByteBuf::writeItemType, FriendlyByteBuf::writeMatterValue)
buff.writeMap(comments, FriendlyByteBuf::writeItemType) { self, value -> self.writeCollection(value, FriendlyByteBuf::writeComponent) }
}
override fun play(context: Supplier<NetworkEvent.Context>) {
if (SERVER_IS_LIVE)
return // singleplayer or LAN host
matterValues.clear()
matterValues.putAll(values)
commentary.clear()
for ((k, v) in comments) {
commentary[k] = ArrayList<Component>(v.size).also { it.addAll(v) }
} }
} else {
return matterValues[value] ?: throw ConcurrentModificationException("${value.registryName} has no matter value in registry, this should be impossible")
} }
} }
} }

View File

@ -2,12 +2,14 @@ package ru.dbotthepony.mc.otm.network
import net.minecraftforge.network.NetworkDirection import net.minecraftforge.network.NetworkDirection
import ru.dbotthepony.mc.otm.android.AndroidResearchManager import ru.dbotthepony.mc.otm.android.AndroidResearchManager
import ru.dbotthepony.mc.otm.matter.MatterManager
object RegistryNetworkChannel : MatteryNetworkChannel( object RegistryNetworkChannel : MatteryNetworkChannel(
version = "1", version = "2",
name = "registry" name = "registry"
) { ) {
fun register() { fun register() {
add(AndroidResearchManager.SyncPacket::class.java, AndroidResearchManager::readSyncPacket, NetworkDirection.PLAY_TO_CLIENT) add(AndroidResearchManager.SyncPacket::class.java, AndroidResearchManager::readSyncPacket, NetworkDirection.PLAY_TO_CLIENT)
add(MatterManager.SyncPacket::class.java, MatterManager::readSyncPacket, NetworkDirection.PLAY_TO_CLIENT)
} }
} }