diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm
index 9e4e16f813..6b99cf8318 100644
--- a/code/datums/components/_component.dm
+++ b/code/datums/components/_component.dm
@@ -52,12 +52,16 @@
return
/**
- * Properly removes the component from `parent` and cleans up references
- * Setting `force` makes it not check for and remove the component from the parent
- * Setting `silent` deletes the component without sending a `COMSIG_COMPONENT_REMOVING` signal
- */
+ * Properly removes the component from `parent` and cleans up references
+ *
+ * Arguments:
+ * * force - makes it not check for and remove the component from the parent
+ * * silent - deletes the component without sending a [COMSIG_COMPONENT_REMOVING] signal
+ */
/datum/component/Destroy(force=FALSE, silent=FALSE)
- if(!force && parent)
+ if(!parent)
+ return ..()
+ if(!force)
_RemoveFromParent()
if(!silent)
SEND_SIGNAL(parent, COMSIG_COMPONENT_REMOVING, src)
diff --git a/code/datums/components/acid.dm b/code/datums/components/acid.dm
index 2e3784dc97..39e9b2cb63 100644
--- a/code/datums/components/acid.dm
+++ b/code/datums/components/acid.dm
@@ -38,9 +38,11 @@
/datum/component/acid/Destroy()
STOP_PROCESSING(SSprocessing, src)
- var/obj/O = parent
level = 0
- O.update_overlays()
+ if(parent) // So, this is how you get runtimes fellas.
+ UnregisterSignal(parent, list(COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ATOM_ATTACK_HAND)) // Don't worry about isitem checks, we don't need them.
+ var/atom/O = parent
+ O.update_icon(UPDATE_OVERLAYS)
return ..()
/datum/component/acid/process()
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index bc4e1d568e..f107243879 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -603,9 +603,13 @@
//SHOULD_CALL_PARENT(TRUE)
return SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON_STATE)
-/// Updates the overlays of the atom
+/**
+ * Builds a list of overlays for the atom, this will not apply them.
+ * If you need to update overlays, use [update_icon(UPDATE_OVERLAYS)],
+ * This proc is intended to be overridden.
+ */
/atom/proc/update_overlays()
- //SHOULD_CALL_PARENT(TRUE)
+ SHOULD_CALL_PARENT(TRUE)
. = list()
SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_OVERLAYS, .)
diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm
index 3640db2d8a..7e9bea2c5d 100644
--- a/code/game/objects/items/apc_frame.dm
+++ b/code/game/objects/items/apc_frame.dm
@@ -95,7 +95,7 @@
/obj/item/wallframe/apc/try_build(turf/on_wall, user)
if(!..())
return
- var/turf/T = get_turf(on_wall) //the user is not where it needs to be.
+ var/turf/T = get_turf(user)
var/area/A = get_area(T)
if(A.get_apc())
to_chat(user, "This area already has an APC!")
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index 5058060f54..42626c4a3b 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -763,6 +763,8 @@
if(isobj(target))
if(actually_paints)
+ if(istype(target, /obj/item/canvas)) //dont color our canvas neon green when im trying to paint please
+ return
var/list/hsl = rgb2hsl(hex2num(copytext(paint_color,2,4)),hex2num(copytext(paint_color,4,6)),hex2num(copytext(paint_color,6,8)))
var/static/whitelisted = typecacheof(list(/obj/structure/window,
/obj/effect/decal/cleanable/crayon,
diff --git a/code/game/objects/structures/loot_pile.dm b/code/game/objects/structures/loot_pile.dm
index b6249ec1e4..dc3971fdd2 100644
--- a/code/game/objects/structures/loot_pile.dm
+++ b/code/game/objects/structures/loot_pile.dm
@@ -9,6 +9,7 @@
icon_state = "randompile"
density = FALSE
anchored = TRUE
+ max_integrity = 100
var/loot_amount = 5
var/delete_on_depletion = FALSE
var/can_use_hands = TRUE
diff --git a/html/changelog.html b/html/changelog.html
index 4de7aada2a..98f6a77046 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -5,7 +5,7 @@