Hi,
What you can do is create several warehouses, one per type of products and select the warehouse in each product.
Then, create several sets of shipping methods, one set per warehouse.
Finally, create one set of payment methods per shipping methods set.
That way, during the checkout, the system will group the products per warehouse and ask you to select one shipping method per group of products. Then, the system will only display the payment methods which are available for all the shipping methods selected. And in that case, it shouldn't find any of them and the customer will get an error message (which can be customized with a translation override) and he won't be able to finish his checkout.
So it would be an automated way to force the customers to not be able to purchase products from different warehouses in the same order.