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
|
|
|
|
import net.minecraft.nbt.CompoundTag
|
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-03-03 03:32:30 +00:00
|
|
|
val tag = CompoundTag()
|
|
|
|
be.writeDeviceConfiguration(tag)
|
|
|
|
buf.writeCompoundTag(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-03-03 03:32:30 +00:00
|
|
|
val tag = buf.readCompoundTag() ?: 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()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|