PhysicalConnectivity/src/main/kotlin/net/shadowfacts/phycon/networking/C2SConfigureDevice.kt

50 lines
1.7 KiB
Kotlin
Raw Normal View History

2021-02-28 22:56:25 +00:00
package net.shadowfacts.phycon.networking
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs
import net.fabricmc.fabric.api.networking.v1.PacketSender
2021-03-03 03:32:30 +00:00
import net.minecraft.block.entity.BlockEntity
2021-12-22 23:59:51 +00:00
import net.minecraft.nbt.NbtCompound
2021-02-28 22:56:25 +00:00
import net.minecraft.network.Packet
import net.minecraft.network.PacketByteBuf
import net.minecraft.server.MinecraftServer
import net.minecraft.server.network.ServerPlayNetworkHandler
import net.minecraft.server.network.ServerPlayerEntity
import net.minecraft.util.Identifier
import net.shadowfacts.phycon.PhysicalConnectivity
2021-03-03 03:32:30 +00:00
import net.shadowfacts.phycon.util.ClientConfigurableDevice
2021-02-28 22:56:25 +00:00
/**
* @author shadowfacts
*/
2021-03-03 03:32:30 +00:00
object C2SConfigureDevice: ServerReceiver {
override val CHANNEL = Identifier(PhysicalConnectivity.MODID, "configure_device")
2021-02-28 22:56:25 +00:00
2021-03-03 03:32:30 +00:00
operator fun <T> invoke(be: T): Packet<*> where T: BlockEntity, T: ClientConfigurableDevice {
2021-02-28 22:56:25 +00:00
val buf = PacketByteBufs.create()
buf.writeIdentifier(be.world!!.registryKey.value)
buf.writeBlockPos(be.pos)
2021-12-22 23:59:51 +00:00
val tag = NbtCompound()
2021-03-03 03:32:30 +00:00
be.writeDeviceConfiguration(tag)
2021-12-22 23:59:51 +00:00
buf.writeNbt(tag)
2021-02-28 22:56:25 +00:00
return createPacket(buf)
}
override fun receive(server: MinecraftServer, player: ServerPlayerEntity, handler: ServerPlayNetworkHandler, buf: PacketByteBuf, responseSender: PacketSender) {
val dimID = buf.readIdentifier()
val pos = buf.readBlockPos()
2021-12-22 23:59:51 +00:00
val tag = buf.readNbt() ?: return
2021-02-28 22:56:25 +00:00
server.execute {
2021-03-03 03:32:30 +00:00
// todo: check if the player is close enough
val world = player.world
if (world.registryKey.value != dimID) return@execute
val be = world.getBlockEntity(pos) ?: return@execute
val device = be as? ClientConfigurableDevice ?: return@execute
device.loadDeviceConfiguration(tag)
2021-02-28 22:56:25 +00:00
be.markDirty()
}
}
}