diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 6d65e39dd8..9ec56f1fc9 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -248,7 +248,6 @@ BLIND // can't see anything
var/rolled_down = 0
var/basecolor
-
/obj/item/clothing/under/attackby(obj/item/I, mob/user)
if(hastie)
hastie.attackby(I, user)
@@ -257,7 +256,7 @@ BLIND // can't see anything
if(!hastie && istype(I, /obj/item/clothing/tie))
user.drop_item()
hastie = I
- hastie.attach_to(src, user)
+ hastie.on_attached(src, user)
if(istype(loc, /mob/living/carbon/human))
var/mob/living/carbon/human/H = loc
@@ -274,7 +273,7 @@ BLIND // can't see anything
return
..()
-//This is to allow people to take off suits when there is an attached accessory
+//This is to ensure people can take off suits when there is an attached accessory
/obj/item/clothing/under/MouseDrop(obj/over_object as obj)
if (ishuman(usr) || ismonkey(usr))
//makes sure that the clothing is equipped so that we can't drag it into our hand from miles away.
@@ -352,6 +351,17 @@ BLIND // can't see anything
else
usr << "You cannot roll down the uniform!"
+/obj/item/clothing/under/proc/remove_accessory(mob/user as mob)
+ if(!hastie)
+ return
+
+ hastie.on_removed(user)
+ hastie = null
+
+ if(istype(loc, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = loc
+ H.update_inv_w_uniform()
+
/obj/item/clothing/under/verb/removetie()
set name = "Remove Accessory"
set category = "Object"
@@ -359,13 +369,7 @@ BLIND // can't see anything
if(!istype(usr, /mob/living)) return
if(usr.stat) return
- if(hastie)
- hastie.remove(usr)
- hastie = null
-
- if(istype(loc, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = loc
- H.update_inv_w_uniform()
+ src.remove_accessory(usr)
/obj/item/clothing/under/rank/New()
sensor_mode = pick(0,1,2,3)
diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm
index 9f45d7a53d..a88cd5033c 100644
--- a/code/modules/clothing/under/ties.dm
+++ b/code/modules/clothing/under/ties.dm
@@ -9,23 +9,42 @@
slot_flags = 0
w_class = 2.0
var/obj/item/clothing/under/has_suit = null //the suit the tie may be attached to
+ var/image/inv_overlay = null //overlay used when attached to clothing.
+
+/obj/item/clothing/tie/New()
+ ..()
+ inv_overlay = image("icon" = 'icons/obj/clothing/ties_overlay.dmi', "icon_state" = "[item_color? "[item_color]" : "[icon_state]"]")
//when user attached an accessory to S
-/obj/item/clothing/tie/proc/attach_to(obj/item/clothing/under/S, mob/user as mob)
+/obj/item/clothing/tie/proc/on_attached(obj/item/clothing/under/S, mob/user as mob)
if(!istype(S))
return
has_suit = S
loc = has_suit
+ has_suit.overlays += inv_overlay
+
user << "You attach [src] to [has_suit]."
src.add_fingerprint(user)
-/obj/item/clothing/tie/proc/remove(mob/user as mob)
+/obj/item/clothing/tie/proc/on_removed(mob/user as mob)
if(!has_suit)
return
+ has_suit.overlays -= inv_overlay
has_suit = null
usr.put_in_hands(src)
src.add_fingerprint(user)
+//default attackby behaviour
+/obj/item/clothing/tie/attackby(obj/item/I, mob/user)
+ ..()
+
+//default attack_hand behaviour
+/obj/item/clothing/tie/attack_hand(mob/user as mob)
+ if(has_suit)
+ has_suit.remove_accessory(user)
+ return //we aren't an object on the ground so don't call parent
+ ..()
+
/obj/item/clothing/tie/blue
name = "blue tie"
icon_state = "bluetie"
@@ -244,11 +263,11 @@
else
usr << "It is empty."
-/obj/item/clothing/tie/holster/attach_to(obj/item/clothing/under/S, mob/user as mob)
+/obj/item/clothing/tie/holster/on_attached(obj/item/clothing/under/S, mob/user as mob)
..()
has_suit.verbs += /obj/item/clothing/tie/holster/verb/holster_verb
-/obj/item/clothing/tie/holster/remove(mob/user as mob)
+/obj/item/clothing/tie/holster/on_removed(mob/user as mob)
has_suit.verbs -= /obj/item/clothing/tie/holster/verb/holster_verb
..()
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 2c4a381d6e..72232764d1 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -501,6 +501,7 @@ proc/get_damage_icon_part(damage_state, body_part)
overlays_standing[UNIFORM_LAYER] = standing
else
overlays_standing[UNIFORM_LAYER] = null
+ // This really, really seems like it should not be mixed in the middle of display code...
// Automatically drop anything in store / id / belt if you're not wearing a uniform. //CHECK IF NECESARRY
for( var/obj/item/thing in list(r_store, l_store, wear_id, belt) ) //
if(thing) //
diff --git a/icons/obj/clothing/ties_overlay.dmi b/icons/obj/clothing/ties_overlay.dmi
new file mode 100644
index 0000000000..6c6a65afc1
Binary files /dev/null and b/icons/obj/clothing/ties_overlay.dmi differ