package net.shadowfacts.phycon.network import net.minecraft.block.entity.BlockEntity import net.minecraft.block.entity.BlockEntityType import net.minecraft.nbt.CompoundTag import net.minecraft.util.Tickable import net.shadowfacts.phycon.api.PacketSink import net.shadowfacts.phycon.api.packet.Packet import net.shadowfacts.phycon.api.util.MACAddress import java.util.* /** * @author shadowfacts */ abstract class DeviceBlockEntity(type: BlockEntityType<*>): BlockEntity(type), Tickable, PacketSink { var macAddress = MACAddress.random() protected set private val sendQueue = LinkedList() override fun handle(packet: Packet) { if (acceptsPacket(packet)) { handlePacket(packet) } } abstract fun handlePacket(packet: Packet) fun acceptsPacket(packet: Packet): Boolean { return when (packet.destination.type) { MACAddress.Type.BROADCAST -> true MACAddress.Type.UNICAST -> macAddress == packet.destination MACAddress.Type.MULTICAST -> acceptsMulticastPacket(packet) } } fun acceptsMulticastPacket(packet: Packet): Boolean { return false } fun enqueue(packet: Packet) { sendQueue.add(packet) } override fun tick() { if (sendQueue.isNotEmpty()) { val packet = sendQueue.pop() val destinations = NetworkUtil.findDestinations(world!!, pos) destinations.forEach { it.handle(packet) } } } override fun toTag(tag: CompoundTag): CompoundTag { tag.putLong("MACAddress", macAddress.address) return super.toTag(tag) } override fun fromTag(tag: CompoundTag) { super.fromTag(tag) macAddress = MACAddress(tag.getLong("MACAddress")) } }