diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index 7f7f733ad86..af470ead50b 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -367,7 +367,8 @@
.["has_cap"] = has_cap
.["is_capped"] = is_capped
.["can_change_colour"] = can_change_colour
- .["current_colour"] = paint_color
+ .["selected_color"] = GLOB.pipe_color_name[paint_color] || paint_color
+ .["paint_colors"] = GLOB.pipe_paint_colors
/obj/item/toy/crayon/ui_act(action, list/params)
. = ..()
@@ -390,8 +391,14 @@
text_buffer = ""
else
paint_mode = PAINT_NORMAL
- if("select_colour")
+ if("custom_color")
. = can_change_colour && pick_painting_tool_color(usr, paint_color)
+ if("color")
+ if(!can_change_colour)
+ return
+ paint_color = GLOB.pipe_paint_colors[params["paint_color"]]
+ set_painting_tool_color(paint_color)
+ . = TRUE
if("enter_text")
var/txt = tgui_input_text(usr, "Choose what to write", "Scribbles", text_buffer)
if(isnull(txt))
@@ -841,7 +848,6 @@
user.visible_message(span_notice("[user] coats [target] with spray paint!"), span_notice("You coat [target] with spray paint."))
return
-
if(isobj(target) && !(target.flags_1 & UNPAINTABLE_1))
var/color_is_dark = FALSE
if(actually_paints)
@@ -851,7 +857,26 @@
to_chat(user, span_warning("A color that dark on an object like this? Surely not..."))
return FALSE
- target.add_atom_colour(paint_color, WASHABLE_COLOUR_PRIORITY)
+ if(istype(target, /obj/item/pipe))
+ if(GLOB.pipe_color_name.Find(paint_color))
+ var/obj/item/pipe/target_pipe = target
+ target_pipe.pipe_color = paint_color
+ target.add_atom_colour(paint_color, FIXED_COLOUR_PRIORITY)
+ balloon_alert(user, "painted in [GLOB.pipe_color_name[paint_color]] color")
+ else
+ balloon_alert(user, "invalid pipe color!")
+ return FALSE
+ else if(istype(target, /obj/machinery/atmospherics))
+ if(GLOB.pipe_color_name.Find(paint_color))
+ var/obj/machinery/atmospherics/target_pipe = target
+ target_pipe.paint(paint_color)
+ balloon_alert(user, "painted in [GLOB.pipe_color_name[paint_color]] color")
+ else
+ balloon_alert(user, "invalid pipe color!")
+ return FALSE
+ else
+ target.add_atom_colour(paint_color, WASHABLE_COLOUR_PRIORITY)
+
if(isitem(target) && isliving(target.loc))
var/obj/item/target_item = target
var/mob/living/holder = target.loc
@@ -859,6 +884,7 @@
holder.update_held_items()
else
holder.update_clothing(target_item.slot_flags)
+
if(!(SEND_SIGNAL(target, COMSIG_OBJ_PAINTED, user, src, color_is_dark) & DONT_USE_SPRAYCAN_CHARGES))
use_charges(user, 2, requires_full = FALSE)
reagents.trans_to(target, ., volume_multiplier, transferred_by = user, methods = VAPOR)
diff --git a/code/game/objects/items/devices/pipe_painter.dm b/code/game/objects/items/devices/pipe_painter.dm
index 63ae58a0ae3..3a3b9055725 100644
--- a/code/game/objects/items/devices/pipe_painter.dm
+++ b/code/game/objects/items/devices/pipe_painter.dm
@@ -9,19 +9,24 @@
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/glass = SHEET_MATERIAL_AMOUNT)
-/obj/item/pipe_painter/afterattack(atom/A, mob/user, proximity_flag)
+/obj/item/pipe_painter/afterattack(atom/target, mob/user, proximity_flag)
. = ..()
//Make sure we only paint adjacent items
if(!proximity_flag)
return
- if(!istype(A, /obj/machinery/atmospherics/pipe))
- return
-
- var/obj/machinery/atmospherics/pipe/P = A
- if(P.paint(GLOB.pipe_paint_colors[paint_color]))
+ if(istype(target, /obj/machinery/atmospherics))
+ var/obj/machinery/atmospherics/target_pipe = target
+ target_pipe.paint(GLOB.pipe_paint_colors[paint_color])
playsound(src, 'sound/machines/click.ogg', 50, TRUE)
- user.visible_message(span_notice("[user] paints \the [P] [paint_color]."),span_notice("You paint \the [P] [paint_color]."))
+ balloon_alert(user, "painted in [paint_color] color")
+ else if(istype(target, /obj/item/pipe))
+ var/obj/item/pipe/target_pipe = target
+ var/color = GLOB.pipe_paint_colors[paint_color]
+ target_pipe.pipe_color = color
+ target.add_atom_colour(color, FIXED_COLOUR_PRIORITY)
+ playsound(src, 'sound/machines/click.ogg', 50, TRUE)
+ balloon_alert(user, "painted in [paint_color] color")
/obj/item/pipe_painter/attack_self(mob/user)
paint_color = tgui_input_list(user, "Which colour do you want to use?", "Pipe painter", GLOB.pipe_paint_colors)
diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm
index 62c2b562d51..f07d452c662 100644
--- a/code/modules/atmospherics/machinery/atmosmachinery.dm
+++ b/code/modules/atmospherics/machinery/atmosmachinery.dm
@@ -613,12 +613,16 @@
return
/**
- * Called by the RPD.dm pre_attack(), overriden by pipes.dm
+ * Called by the RPD.dm pre_attack()
* Arguments:
* * paint_color - color that the pipe will be painted in (colors in hex like #4f4f4f)
*/
/obj/machinery/atmospherics/proc/paint(paint_color)
- return FALSE
+ if(paintable)
+ add_atom_colour(paint_color, FIXED_COLOUR_PRIORITY)
+ set_pipe_color(paint_color)
+ update_node_icon()
+ return paintable
/// Setter for pipe color, so we can ensure it's all uniform and save cpu time
/obj/machinery/atmospherics/proc/set_pipe_color(pipe_colour)
diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm
index e9899ab654e..9e1f4f0de21 100644
--- a/code/modules/atmospherics/machinery/components/components_base.dm
+++ b/code/modules/atmospherics/machinery/components/components_base.dm
@@ -245,13 +245,6 @@
/obj/machinery/atmospherics/components/return_analyzable_air()
return airs
-/obj/machinery/atmospherics/components/paint(paint_color)
- if(paintable)
- add_atom_colour(paint_color, FIXED_COLOUR_PRIORITY)
- set_pipe_color(paint_color)
- update_node_icon()
- return paintable
-
/**
* Disconnects all nodes from ourselves, remove us from the node's nodes.
* Nullify our parent pipenet
diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm
index c94caf31174..c0dc18c0e8e 100644
--- a/code/modules/atmospherics/machinery/pipes/pipes.dm
+++ b/code/modules/atmospherics/machinery/pipes/pipes.dm
@@ -143,12 +143,5 @@
var/obj/machinery/atmospherics/current_node = nodes[i]
current_node.update_icon()
-/obj/machinery/atmospherics/pipe/paint(paint_color)
- if(paintable)
- add_atom_colour(paint_color, FIXED_COLOUR_PRIORITY)
- set_pipe_color(pipe_color)
- update_node_icon()
- return paintable
-
/obj/machinery/atmospherics/pipe/update_layer()
layer = initial(layer) + (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_LCHANGE + (GLOB.pipe_colors_ordered[pipe_color] * 0.0001)
diff --git a/tgui/packages/tgui/interfaces/Crayon.tsx b/tgui/packages/tgui/interfaces/Crayon.tsx
index 73a5ce563d3..3e27ca2d361 100644
--- a/tgui/packages/tgui/interfaces/Crayon.tsx
+++ b/tgui/packages/tgui/interfaces/Crayon.tsx
@@ -2,6 +2,7 @@ import { BooleanLike } from 'common/react';
import { useBackend } from '../backend';
import { Button, LabeledList, Section } from '../components';
import { Window } from '../layouts';
+import { ColorItem } from './RapidPipeDispenser';
type Data = {
has_cap: BooleanLike;
@@ -43,11 +44,14 @@ export const Crayon = (props, context) => {
onClick={() => act('toggle_cap')}
/>
+
+
+
-