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();
|
MenuNetworkChannel.INSTANCE.register();
|
||||||
WeaponNetworkChannel.INSTANCE.register();
|
WeaponNetworkChannel.INSTANCE.register();
|
||||||
RegistryNetworkChannel.INSTANCE.register();
|
RegistryNetworkChannel.INSTANCE.register();
|
||||||
WorldNetworkChannel.INSTANCE.register();
|
|
||||||
GenericNetworkChannel.INSTANCE.register();
|
GenericNetworkChannel.INSTANCE.register();
|
||||||
|
|
||||||
ITEM_STORAGE = StorageRegistry.register(ItemStackWrapper.class, ItemStackWrapper.EMPTY, new Decimal("3.125"));
|
ITEM_STORAGE = StorageRegistry.register(ItemStackWrapper.class, ItemStackWrapper.EMPTY, new Decimal("3.125"));
|
||||||
|
@ -1,36 +1,28 @@
|
|||||||
package ru.dbotthepony.mc.otm.android.feature
|
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.gui.GuiGraphics
|
||||||
import net.minecraft.client.multiplayer.ClientLevel
|
import net.minecraft.client.multiplayer.ClientLevel
|
||||||
import net.minecraft.network.FriendlyByteBuf
|
import net.minecraft.network.FriendlyByteBuf
|
||||||
import net.minecraft.resources.ResourceLocation
|
|
||||||
import net.minecraft.world.entity.Entity
|
import net.minecraft.world.entity.Entity
|
||||||
import net.minecraft.world.entity.item.ItemEntity
|
import net.minecraft.world.entity.item.ItemEntity
|
||||||
import net.minecraftforge.network.NetworkEvent
|
import net.minecraftforge.network.NetworkEvent
|
||||||
import ru.dbotthepony.mc.otm.OverdriveThatMatters
|
|
||||||
import ru.dbotthepony.mc.otm.config.AndroidConfig
|
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.android.AndroidSwitchableFeature
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability
|
import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability
|
||||||
import ru.dbotthepony.mc.otm.capability.energy.extractEnergyExact
|
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.minecraft
|
||||||
import ru.dbotthepony.mc.otm.client.render.ResearchIcons
|
import ru.dbotthepony.mc.otm.client.render.ResearchIcons
|
||||||
import ru.dbotthepony.mc.otm.core.math.Vector
|
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.getEntitiesInEllipsoid
|
||||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||||
import ru.dbotthepony.mc.otm.core.math.minus
|
import ru.dbotthepony.mc.otm.core.math.minus
|
||||||
import ru.dbotthepony.mc.otm.core.math.plus
|
import ru.dbotthepony.mc.otm.core.math.plus
|
||||||
import ru.dbotthepony.mc.otm.core.position
|
import ru.dbotthepony.mc.otm.core.position
|
||||||
import ru.dbotthepony.mc.otm.core.math.times
|
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.MatteryPacket
|
||||||
import ru.dbotthepony.mc.otm.network.WorldNetworkChannel
|
|
||||||
import ru.dbotthepony.mc.otm.network.packetHandled
|
import ru.dbotthepony.mc.otm.network.packetHandled
|
||||||
import ru.dbotthepony.mc.otm.registry.AndroidFeatures
|
import ru.dbotthepony.mc.otm.registry.AndroidFeatures
|
||||||
import ru.dbotthepony.mc.otm.registry.MNames
|
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
import java.util.WeakHashMap
|
import java.util.WeakHashMap
|
||||||
import java.util.function.Predicate
|
import java.util.function.Predicate
|
||||||
@ -90,7 +82,7 @@ class ItemMagnetFeature(capability: MatteryPlayerCapability) : AndroidSwitchable
|
|||||||
ent as ItemEntity
|
ent as ItemEntity
|
||||||
|
|
||||||
if (server) {
|
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)) {
|
if (!serverPredicate.test(ent)) {
|
||||||
continue
|
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.Savetables
|
||||||
import ru.dbotthepony.mc.otm.core.util.TickList
|
import ru.dbotthepony.mc.otm.core.util.TickList
|
||||||
import ru.dbotthepony.mc.otm.network.BlockEntitySyncPacket
|
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.synchronizer.FieldSynchronizer
|
||||||
import ru.dbotthepony.mc.otm.network.WorldNetworkChannel
|
|
||||||
import ru.dbotthepony.mc.otm.once
|
import ru.dbotthepony.mc.otm.once
|
||||||
import ru.dbotthepony.mc.otm.onceServer
|
import ru.dbotthepony.mc.otm.onceServer
|
||||||
import java.lang.ref.WeakReference
|
import java.lang.ref.WeakReference
|
||||||
@ -662,7 +662,7 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
|
|||||||
val payload = synchronizer.computeEndpointFor(player).collectNetworkPayload()
|
val payload = synchronizer.computeEndpointFor(player).collectNetworkPayload()
|
||||||
|
|
||||||
if (payload != null) {
|
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
|
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.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 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(
|
object GenericNetworkChannel : MatteryNetworkChannel(
|
||||||
version = "1",
|
version = "2",
|
||||||
name = "generic"
|
name = "generic"
|
||||||
) {
|
) {
|
||||||
fun register() {
|
fun register() {
|
||||||
add(QuantumBatteryItem.ChargePacket::class.java, QuantumBatteryItem.Companion::readPacket, NetworkDirection.PLAY_TO_CLIENT)
|
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