Get rid of world network channel and merge it into generic network channel
This commit is contained in:
parent
651febed96
commit
3262cdfe8d
@ -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"));
|
||||
|
@ -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
|
||||
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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<NetworkEvent.Context>) {
|
||||
context.packetHandled = true
|
||||
|
||||
context.enqueueWork {
|
||||
execute()
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val backlog = WeakHashMap<Level, Object2ObjectOpenHashMap<BlockPos, ArrayList<BlockEntitySyncPacket>>>()
|
||||
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
@ -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<NetworkEvent.Context>) {
|
||||
context.packetHandled = true
|
||||
|
||||
context.enqueueWork {
|
||||
execute()
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val backlog = WeakHashMap<Level, Object2ObjectOpenHashMap<BlockPos, ArrayList<BlockEntitySyncPacket>>>()
|
||||
|
||||
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)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user