The body zone selector now indicates which body part you are about to select when hovered over, and the hover inventory indicator basically shows where you are trying to put an item, and then shows an item ghost in red or green, giving visual feedback as to if that item will go in the slot or not.
Gifs of this in action:
 Body Selection parts.

Inventory Icon Overlays!
Credit goes to @ShadowLarkens for original port to Paradise and assistance with port to Virgo. Sending to Polaris ASAP.
- A note on `code/game/objects/items/weapons/storage/internal.dm`, VSCode automatically corrected the line endings, hence the massive filediff. The only practical changes are the addition of `disable_warning = 0`
- Adds "paintable" flag to pipe recipes so we know if we can paint it.
- Ports the RPD from Yawn Wider.
- Brings RPD sprites from /tg instead.
- Slightly refactors recipes to keep type-specifc vars on subtypes.
- Refactors RPD UI icons to use iconsheet assets: Instead of sending each individual icon to the client as needed, we declare an icon sheet asset and send the entire thing to client. Then we just use the given CSS classes to display the icons!
- Adds icon sheet asset datum for pipe and diposals construction.
- Add additional can_atmos_pass value ATMOS_PASS_PROC which indicates custom behavior requiring calling the CanZASPass proc.
- The benefit being for the other three values we DON'T need to call CanZASPass at all! We already know the behavior without the overhead of a proc call.
- Obviously any atom with can_atmos_pass = ATMOS_PASS_PROC cannot now call ..() in CanZASPass() since the default behavior would be to (recursively) call CanZASPass()
- This required re-numbering the constants, so I also fixed all code that assumed particular values for the constants.
- Switched all types which overrode CanZASPass with custom logic to be can_atmos_pass = ATMOS_PASS_PROC
- Changed /turf/c_airblock() to skip calling /atom/movable/c_airblock() for the three can_atmos_pass values that don't require calling the proc.
- CanZASPass is supposed to return boolean. Nobody noticed this bug because ATMOS_PASS_YES and ATMOS_PASS_NO happen to be defined as 1 and 0. But thats not a good assumption to make, so lets fix it!