From 3262cdfe8d287579bcdbb0852692de2545467104 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Sat, 29 Jul 2023 17:05:42 +0700 Subject: [PATCH] Get rid of world network channel and merge it into generic network channel --- .../mc/otm/OverdriveThatMatters.java | 1 - .../otm/android/feature/ItemMagnetFeature.kt | 12 +- .../mc/otm/block/entity/MatteryBlockEntity.kt | 4 +- .../mc/otm/network/GenericNetworkChannel.kt | 95 +++++++++++++++- .../mc/otm/network/WorldNetworkChannel.kt | 103 ------------------ 5 files changed, 98 insertions(+), 117 deletions(-) delete mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/network/WorldNetworkChannel.kt diff --git a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java index 7a73a9cbb..4161c855d 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java +++ b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java @@ -202,7 +202,6 @@ public final class OverdriveThatMatters { MenuNetworkChannel.INSTANCE.register(); WeaponNetworkChannel.INSTANCE.register(); RegistryNetworkChannel.INSTANCE.register(); - WorldNetworkChannel.INSTANCE.register(); GenericNetworkChannel.INSTANCE.register(); ITEM_STORAGE = StorageRegistry.register(ItemStackWrapper.class, ItemStackWrapper.EMPTY, new Decimal("3.125")); diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/ItemMagnetFeature.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/ItemMagnetFeature.kt index bafb85a0a..066ccb6fb 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/ItemMagnetFeature.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/ItemMagnetFeature.kt @@ -1,36 +1,28 @@ package ru.dbotthepony.mc.otm.android.feature -import com.mojang.blaze3d.vertex.PoseStack -import net.minecraft.ChatFormatting import net.minecraft.client.gui.GuiGraphics import net.minecraft.client.multiplayer.ClientLevel import net.minecraft.network.FriendlyByteBuf -import net.minecraft.resources.ResourceLocation import net.minecraft.world.entity.Entity import net.minecraft.world.entity.item.ItemEntity import net.minecraftforge.network.NetworkEvent -import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.config.AndroidConfig -import ru.dbotthepony.mc.otm.android.AndroidResearchManager import ru.dbotthepony.mc.otm.android.AndroidSwitchableFeature import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability import ru.dbotthepony.mc.otm.capability.energy.extractEnergyExact -import ru.dbotthepony.mc.otm.client.ShiftPressedCond import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.client.render.ResearchIcons import ru.dbotthepony.mc.otm.core.math.Vector -import ru.dbotthepony.mc.otm.core.util.formatPower import ru.dbotthepony.mc.otm.core.getEntitiesInEllipsoid import ru.dbotthepony.mc.otm.core.math.RGBAColor import ru.dbotthepony.mc.otm.core.math.minus import ru.dbotthepony.mc.otm.core.math.plus import ru.dbotthepony.mc.otm.core.position import ru.dbotthepony.mc.otm.core.math.times +import ru.dbotthepony.mc.otm.network.GenericNetworkChannel import ru.dbotthepony.mc.otm.network.MatteryPacket -import ru.dbotthepony.mc.otm.network.WorldNetworkChannel import ru.dbotthepony.mc.otm.network.packetHandled import ru.dbotthepony.mc.otm.registry.AndroidFeatures -import ru.dbotthepony.mc.otm.registry.MNames import java.util.UUID import java.util.WeakHashMap import java.util.function.Predicate @@ -90,7 +82,7 @@ class ItemMagnetFeature(capability: MatteryPlayerCapability) : AndroidSwitchable ent as ItemEntity if (server) { - WorldNetworkChannel.send(ply, ItemEntityDataPacket(ent.id, ent.owner?.uuid, ent.age, ent.lifespan, ent.hasPickUpDelay())) + GenericNetworkChannel.send(ply, ItemEntityDataPacket(ent.id, ent.owner?.uuid, ent.age, ent.lifespan, ent.hasPickUpDelay())) if (!serverPredicate.test(ent)) { continue diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryBlockEntity.kt index 4577c8cee..9c7264abe 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryBlockEntity.kt @@ -58,8 +58,8 @@ import ru.dbotthepony.mc.otm.core.math.plus import ru.dbotthepony.mc.otm.core.util.Savetables import ru.dbotthepony.mc.otm.core.util.TickList import ru.dbotthepony.mc.otm.network.BlockEntitySyncPacket +import ru.dbotthepony.mc.otm.network.GenericNetworkChannel import ru.dbotthepony.mc.otm.network.synchronizer.FieldSynchronizer -import ru.dbotthepony.mc.otm.network.WorldNetworkChannel import ru.dbotthepony.mc.otm.once import ru.dbotthepony.mc.otm.onceServer import java.lang.ref.WeakReference @@ -662,7 +662,7 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc val payload = synchronizer.computeEndpointFor(player).collectNetworkPayload() if (payload != null) { - WorldNetworkChannel.send(player, BlockEntitySyncPacket(blockPos, payload.array, payload.length)) + GenericNetworkChannel.send(player, BlockEntitySyncPacket(blockPos, payload.array, payload.length)) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/GenericNetworkChannel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/GenericNetworkChannel.kt index be695f2e8..778f084d1 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/network/GenericNetworkChannel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/GenericNetworkChannel.kt @@ -1,13 +1,106 @@ package ru.dbotthepony.mc.otm.network +import it.unimi.dsi.fastutil.io.FastByteArrayInputStream +import it.unimi.dsi.fastutil.objects.Object2ObjectFunction +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap +import net.minecraft.core.BlockPos +import net.minecraft.network.FriendlyByteBuf +import net.minecraft.world.level.Level import net.minecraftforge.network.NetworkDirection +import net.minecraftforge.network.NetworkEvent +import org.apache.logging.log4j.LogManager +import ru.dbotthepony.mc.otm.android.feature.ItemEntityDataPacket +import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity +import ru.dbotthepony.mc.otm.client.minecraft +import ru.dbotthepony.mc.otm.client.onceClient import ru.dbotthepony.mc.otm.item.QuantumBatteryItem +import java.util.* +import java.util.function.Supplier +import kotlin.collections.ArrayList + +class BlockEntitySyncPacket(val position: BlockPos, val buffer: ByteArray, val validBytes: Int) : MatteryPacket { + override fun write(buff: FriendlyByteBuf) { + buff.writeBlockPos(position) + buff.writeBytes(buffer, 0, validBytes) + } + + private fun execute() { + val level = minecraft.player?.level() + + if (level == null) { + LOGGER.error("Received BlockEntitySyncPacket before we are in valid level.") + + onceClient { + execute() + } + + return + } + + val blockEntity = level.getBlockEntity(position) + + if (blockEntity == null) { + LOGGER.warn("Putting BlockEntitySyncPacket received for $position into backlog because there is literally no block entity there!") + LOGGER.warn("This is CERTAINLY a bug in one of optimizing mods you have or server has installed!") + LOGGER.warn("This can cause memory leak.") + + backlog.computeIfAbsent(level) { Object2ObjectOpenHashMap() } + .computeIfAbsent(position, Object2ObjectFunction { ArrayList() }) + .add(this) + + return + } else if (blockEntity !is MatteryBlockEntity) { + LOGGER.warn("Dropping BlockEntitySyncPacket received for $position, because there is $blockEntity which is not MatteryBlockEntity!") + backlog[level]?.remove(position) + return + } + + val packets = backlog[level]?.remove(position) + + try { + if (packets != null) { + for (packet in packets) { + blockEntity.synchronizer.read(FastByteArrayInputStream(packet.buffer, 0, packet.validBytes)) + } + } + + blockEntity.synchronizer.read(FastByteArrayInputStream(buffer, 0, validBytes)) + } catch(err: Throwable) { + LOGGER.error("Exception while reading synchronized BlockEntity data!\nPosition: $position\nBlock: ${level.getBlockState(position)}\nBlock entity: $blockEntity", err) + } + } + + override fun play(context: Supplier) { + context.packetHandled = true + + context.enqueueWork { + execute() + } + } + + companion object { + private val backlog = WeakHashMap>>() + + fun read(buff: FriendlyByteBuf): BlockEntitySyncPacket { + val position = buff.readBlockPos() + val size = buff.readableBytes() + val array = ByteArray(size) + buff.readBytes(array) + return BlockEntitySyncPacket(position, array, size) + } + + private val LOGGER = LogManager.getLogger() + } +} object GenericNetworkChannel : MatteryNetworkChannel( - version = "1", + version = "2", name = "generic" ) { fun register() { add(QuantumBatteryItem.ChargePacket::class.java, QuantumBatteryItem.Companion::readPacket, NetworkDirection.PLAY_TO_CLIENT) + + add(BlockEntitySyncPacket::class.java, BlockEntitySyncPacket.Companion::read, NetworkDirection.PLAY_TO_CLIENT) + add(ItemEntityDataPacket::class.java, ItemEntityDataPacket.Companion::read, NetworkDirection.PLAY_TO_CLIENT) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/WorldNetworkChannel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/WorldNetworkChannel.kt deleted file mode 100644 index a0ef27a75..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/network/WorldNetworkChannel.kt +++ /dev/null @@ -1,103 +0,0 @@ -package ru.dbotthepony.mc.otm.network - -import it.unimi.dsi.fastutil.io.FastByteArrayInputStream -import it.unimi.dsi.fastutil.objects.Object2ObjectFunction -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap -import net.minecraft.core.BlockPos -import net.minecraft.network.FriendlyByteBuf -import net.minecraft.world.level.Level -import net.minecraftforge.network.NetworkDirection -import net.minecraftforge.network.NetworkEvent -import org.apache.logging.log4j.LogManager -import ru.dbotthepony.mc.otm.android.feature.ItemEntityDataPacket -import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity -import ru.dbotthepony.mc.otm.client.minecraft -import ru.dbotthepony.mc.otm.client.onceClient -import java.lang.ref.SoftReference -import java.util.WeakHashMap -import java.util.function.Supplier - -class BlockEntitySyncPacket(val position: BlockPos, val buffer: ByteArray, val validBytes: Int) : MatteryPacket { - override fun write(buff: FriendlyByteBuf) { - buff.writeBlockPos(position) - buff.writeBytes(buffer, 0, validBytes) - } - - private fun execute() { - val level = minecraft.player?.level() - - if (level == null) { - LOGGER.error("Received BlockEntitySyncPacket before we are in valid level.") - - onceClient { - execute() - } - - return - } - - val blockEntity = level.getBlockEntity(position) - - if (blockEntity == null) { - LOGGER.warn("Putting BlockEntitySyncPacket received for $position into backlog because there is literally no block entity there!") - LOGGER.warn("This is CERTAINLY a bug in one of optimizing mods you have or server has installed!") - LOGGER.warn("This can cause memory leak.") - - backlog.computeIfAbsent(level) { Object2ObjectOpenHashMap() } - .computeIfAbsent(position, Object2ObjectFunction { ArrayList() }) - .add(this) - - return - } else if (blockEntity !is MatteryBlockEntity) { - LOGGER.warn("Dropping BlockEntitySyncPacket received for $position, because there is $blockEntity which is not MatteryBlockEntity!") - backlog[level]?.remove(position) - return - } - - val packets = backlog[level]?.remove(position) - - try { - if (packets != null) { - for (packet in packets) { - blockEntity.synchronizer.read(FastByteArrayInputStream(packet.buffer, 0, packet.validBytes)) - } - } - - blockEntity.synchronizer.read(FastByteArrayInputStream(buffer, 0, validBytes)) - } catch(err: Throwable) { - LOGGER.error("Exception while reading synchronized BlockEntity data!\nPosition: $position\nBlock: ${level.getBlockState(position)}\nBlock entity: $blockEntity", err) - } - } - - override fun play(context: Supplier) { - context.packetHandled = true - - context.enqueueWork { - execute() - } - } - - companion object { - private val backlog = WeakHashMap>>() - - fun read(buff: FriendlyByteBuf): BlockEntitySyncPacket { - val position = buff.readBlockPos() - val size = buff.readableBytes() - val array = ByteArray(size) - buff.readBytes(array) - return BlockEntitySyncPacket(position, array, size) - } - - private val LOGGER = LogManager.getLogger() - } -} - -object WorldNetworkChannel : MatteryNetworkChannel( - version = "4", - name = "world" -) { - fun register() { - add(BlockEntitySyncPacket::class.java, BlockEntitySyncPacket.Companion::read, NetworkDirection.PLAY_TO_CLIENT) - add(ItemEntityDataPacket::class.java, ItemEntityDataPacket.Companion::read, NetworkDirection.PLAY_TO_CLIENT) - } -}