diff --git a/code/game/machinery/autolathe_datums.dm b/code/game/machinery/autolathe_datums.dm
index 700f0686d0..a29f6ab08c 100644
--- a/code/game/machinery/autolathe_datums.dm
+++ b/code/game/machinery/autolathe_datums.dm
@@ -413,5 +413,3 @@
path = /obj/item/weapon/handcuffs
hidden = 1
category = "General"
-
-
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index c88ad3e641..03814de92c 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -12,6 +12,7 @@
throw_range = 5
origin_tech = list(TECH_MATERIAL = 1)
matter = list(DEFAULT_WALL_MATERIAL = 500)
+ var/elastic
var/dispenser = 0
var/breakouttime = 1200 //Deciseconds = 120s = 2 minutes
var/cuff_sound = 'sound/weapons/handcuffs.ogg'
@@ -53,20 +54,20 @@
var/mob/living/carbon/human/H = target
if(!istype(H))
- return
+ return 0
if (!H.has_organ_for_slot(slot_handcuffed))
user << "\The [H] needs at least two wrists before you can cuff them together!"
- return
+ return 0
- if(istype(H.gloves,/obj/item/clothing/gloves/rig)) // Can't cuff someone who's in a deployed hardsuit.
- user << "The cuffs won't fit around \the [H.gloves]!"
- return
+ if(istype(H.gloves,/obj/item/clothing/gloves/rig) && !elastic) // Can't cuff someone who's in a deployed hardsuit.
+ user << "\The [src] won't fit around \the [H.gloves]!"
+ return 0
user.visible_message("\The [user] is attempting to put [cuff_type] on \the [H]!")
if(!do_after(user,30))
- return
+ return 0
H.attack_log += text("\[[time_stamp()]\] Has been handcuffed (attempt) by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Attempted to handcuff [H.name] ([H.ckey])")
@@ -84,7 +85,7 @@
cuffs.loc = target
target.handcuffed = cuffs
target.update_inv_handcuffed()
- return
+ return 1
var/last_chew = 0
/mob/living/carbon/human/RestrainedClickOn(var/atom/A)
@@ -118,6 +119,7 @@ var/last_chew = 0
breakouttime = 300 //Deciseconds = 30s
cuff_sound = 'sound/weapons/cablecuff.ogg'
cuff_type = "cable restraints"
+ elastic = 1
/obj/item/weapon/handcuffs/cable/red
color = "#DD0000"
@@ -156,3 +158,12 @@ var/last_chew = 0
/obj/item/weapon/handcuffs/cyborg
dispenser = 1
+
+/obj/item/weapon/handcuffs/cable/tape
+ name = "tape restraints"
+ desc = "DIY!"
+ icon_state = "tape_cross"
+ item_state = null
+ icon = 'icons/obj/bureaucracy.dmi'
+ breakouttime = 200
+ cuff_type = "duct tape"
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm
index 911a6334d2..57a31cdd1d 100644
--- a/code/game/objects/items/weapons/tape.dm
+++ b/code/game/objects/items/weapons/tape.dm
@@ -5,18 +5,71 @@
icon_state = "taperoll"
w_class = 1
-/* -- Disabled for now until it has a use --
-/obj/item/weapon/tape_roll/attack_self(mob/user as mob)
- user << "You remove a length of tape from [src]."
-
- var/obj/item/weapon/ducttape/tape = new()
- user.put_in_hands(tape)
-*/
+/obj/item/weapon/tape_roll/attack(var/mob/living/carbon/human/H, var/mob/user)
+ if(istype(H))
+ if(user.zone_sel.selecting == "eyes")
+
+ if(!H.organs_by_name["head"])
+ user << "\The [H] doesn't have a head."
+ return
+ if(!H.has_eyes())
+ user << "\The [H] doesn't have any eyes."
+ return
+ if(H.glasses)
+ user << "\The [H] is already wearing somethign on their eyes."
+ return
+ if(H.head && (H.head.body_parts_covered & FACE))
+ user << "Remove their [H.head] first."
+ return
+ user.visible_message("\The [user] begins taping over \the [H]'s eyes!")
+
+ if(!do_after(user, 30))
+ return
+
+ // Repeat failure checks.
+ if(!H || !src || !H.organs_by_name["head"] || !H.has_eyes() || H.glasses || (H.head && (H.head.body_parts_covered & FACE)))
+ return
+
+ user.visible_message("\The [user] has taped up \the [H]'s eyes!")
+ H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/blindfold/tape(H), slot_glasses)
+
+ else if(user.zone_sel.selecting == "mouth" || user.zone_sel.selecting == "head")
+ if(!H.organs_by_name["head"])
+ user << "\The [H] doesn't have a head."
+ return
+ if(!H.check_has_mouth())
+ user << "\The [H] doesn't have a mouth."
+ return
+ if(H.wear_mask)
+ user << "\The [H] is already wearing a mask."
+ return
+ if(H.head && (H.head.body_parts_covered & FACE))
+ user << "Remove their [H.head] first."
+ return
+ user.visible_message("\The [user] begins taping up \the [H]'s mouth!")
+
+ if(!do_after(user, 30))
+ return
+
+ // Repeat failure checks.
+ if(!H || !src || !H.organs_by_name["head"] || !H.check_has_mouth() || H.wear_mask || (H.head && (H.head.body_parts_covered & FACE)))
+ return
+
+ user.visible_message("\The [user] has taped up \the [H]'s mouth!")
+ H.equip_to_slot_or_del(new /obj/item/clothing/mask/muzzle/tape(H), slot_wear_mask)
+
+ else if(user.zone_sel.selecting == "r_hand" || user.zone_sel.selecting == "l_hand")
+ var/obj/item/weapon/handcuffs/cable/tape/T = new(user)
+ if(!T.place_handcuffs(H, user))
+ user.unEquip(T)
+ qdel(T)
+ else
+ return ..()
+ return 1
/obj/item/weapon/tape_roll/proc/stick(var/obj/item/weapon/W, mob/user)
if(!istype(W, /obj/item/weapon/paper))
return
-
user.drop_from_inventory(W)
var/obj/item/weapon/ducttape/tape = new(get_turf(src))
tape.attach(W)
@@ -52,7 +105,7 @@
return
user << "You remove \the [initial(name)] from [stuck]."
-
+
user.drop_from_inventory(src)
stuck.forceMove(get_turf(src))
user.put_in_hands(stuck)
@@ -61,6 +114,7 @@
qdel(src)
/obj/item/weapon/ducttape/afterattack(var/A, mob/user, flag, params)
+
if(!in_range(user, A) || istype(A, /obj/machinery/door) || !stuck)
return
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index c5fadf4463..0ba28aa3cc 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -183,6 +183,14 @@
item_state = "blindfold"
//vision_flags = BLIND // This flag is only supposed to be used if it causes permanent blindness, not temporary because of glasses
+/obj/item/clothing/glasses/sunglasses/blindfold/tape
+ name = "length of tape"
+ desc = "It's a robust DIY blindfold!"
+ icon = 'icons/obj/bureaucracy.dmi'
+ icon_state = "tape_cross"
+ item_state = null
+ w_class = 1
+
/obj/item/clothing/glasses/sunglasses/prescription
name = "prescription sunglasses"
prescription = 1
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index c0b99d954a..f4cd0dbbc8 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -8,6 +8,14 @@
gas_transfer_coefficient = 0.90
voicechange = 1
+/obj/item/clothing/mask/muzzle/tape
+ name = "length of tape"
+ desc = "It's a robust DIY muzzle!"
+ icon = 'icons/obj/bureaucracy.dmi'
+ icon_state = "tape_cross"
+ item_state = null
+ w_class = 1
+
/obj/item/clothing/mask/muzzle/New()
..()
say_messages = list("Mmfph!", "Mmmf mrrfff!", "Mmmf mnnf!")
diff --git a/code/modules/mob/living/carbon/resist.dm b/code/modules/mob/living/carbon/resist.dm
index bb0e27e73e..8b33f7a586 100644
--- a/code/modules/mob/living/carbon/resist.dm
+++ b/code/modules/mob/living/carbon/resist.dm
@@ -20,7 +20,7 @@
return
..()
-
+
if(handcuffed)
spawn() escape_handcuffs()
else if(legcuffed)
@@ -47,6 +47,11 @@
breakouttime = HC.breakouttime
displaytime = breakouttime / 600 //Minutes
+ var/mob/living/carbon/human/H = src
+ if(istype(H) && H.gloves && istype(H.gloves,/obj/item/clothing/gloves/rig))
+ breakouttime /= 2
+ displaytime /= 2
+
visible_message(
"\The [src] attempts to remove \the [HC]!",
"You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)"
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
index 22ab5327e2..5e6d56b219 100644
Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ
diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi
index 7928b24698..7ff6b43cb8 100644
Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ
diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi
index 3a479f85d0..f8b7e566d3 100644
Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ