package net.shadowfacts.phycon.networking import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking import net.fabricmc.fabric.api.networking.v1.PacketByteBufs import net.fabricmc.fabric.api.networking.v1.PacketSender import net.minecraft.item.ItemStack 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.minecraft.util.registry.Registry import net.minecraft.util.registry.RegistryKey import net.shadowfacts.phycon.PhysicalConnectivity import net.shadowfacts.phycon.block.terminal.AbstractTerminalBlockEntity import net.shadowfacts.phycon.util.readItemStackWithoutCount import net.shadowfacts.phycon.util.writeItemStackWithoutCount /** * @author shadowfacts */ object C2STerminalRequestItem: ServerReceiver { override val CHANNEL = Identifier(PhysicalConnectivity.MODID, "terminal_request_item") operator fun invoke(terminal: AbstractTerminalBlockEntity, stack: ItemStack, amount: Int): Packet<*> { val buf = PacketByteBufs.create() buf.writeIdentifier(terminal.world!!.registryKey.value) buf.writeBlockPos(terminal.pos) // Don't send the count of the fake stack when sending over the network because // PacketByteBuf serializes the stack count as a byte. Otherwise counts > 127 will result in // an overflow and be negative on the receiving side. buf.writeItemStackWithoutCount(stack) buf.writeVarInt(amount) return ClientPlayNetworking.createC2SPacket(CHANNEL, buf) } override fun receive(server: MinecraftServer, player: ServerPlayerEntity, handler: ServerPlayNetworkHandler, buf: PacketByteBuf, responseSender: PacketSender) { val dimID = buf.readIdentifier() val pos = buf.readBlockPos() val stack = buf.readItemStackWithoutCount() val amount = buf.readVarInt() server.execute { val key = RegistryKey.of(Registry.WORLD_KEY, dimID) val world = server.getWorld(key) ?: return@execute val terminal = world.getBlockEntity(pos) as? AbstractTerminalBlockEntity ?: return@execute terminal.requestItem(stack, amount) } } }