diff --git a/code/modules/clothing/under/accessories/accessory_vr.dm b/code/modules/clothing/under/accessories/accessory_vr.dm
index 455bbbccd5..51c8c3279e 100644
--- a/code/modules/clothing/under/accessories/accessory_vr.dm
+++ b/code/modules/clothing/under/accessories/accessory_vr.dm
@@ -31,9 +31,100 @@
/obj/item/clothing/accessory/collar/shock
name = "Shock collar"
desc = "A collar used to ease hungry predators."
- icon_state = "collar_shk"
+ icon_state = "collar_shk0"
item_state = "collar_shk_overlay"
overlay_state = "collar_shk_overlay"
+ // How about some copypasta?
+ var/on = 0 // 0 for off, 1 for on, starts off to encourage people to set non-default frequencies and codes.
+ var/frequency = 1449
+ var/code = 2
+ var/datum/radio_frequency/radio_connection
+ var/list/datum/radio_frequency/secure_radio_connections = new
+ proc/set_frequency(new_frequency)
+ radio_controller.remove_object(src, frequency)
+ frequency = new_frequency
+ radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT)
+
+/obj/item/clothing/accessory/collar/shock/New()
+ radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT) // Makes it so you don't need to change the frequency off of default for it to work.
+
+/obj/item/clothing/accessory/collar/shock/Topic(href, href_list)
+ if(usr.stat || usr.restrained())
+ return
+ if(((istype(usr, /mob/living/carbon/human) && ((!( ticker ) || (ticker && ticker.mode != "monkey")) && usr.contents.Find(src))) || (usr.contents.Find(master) || (in_range(src, usr) && istype(loc, /turf)))))
+ usr.set_machine(src)
+ if(href_list["freq"])
+ var/new_frequency = sanitize_frequency(frequency + text2num(href_list["freq"]))
+ set_frequency(new_frequency)
+ else
+ if(href_list["code"])
+ code += text2num(href_list["code"])
+ code = round(code)
+ code = min(100, code)
+ code = max(1, code)
+ else
+ if(href_list["power"])
+ on = !( on )
+ icon_state = "collar_shk[on]" // And apparently this works, too?!
+ if(!( master ))
+ if(istype(loc, /mob))
+ attack_self(loc)
+ else
+ for(var/mob/M in viewers(1, src))
+ if(M.client)
+ attack_self(M)
+ else
+ if(istype(master.loc, /mob))
+ attack_self(master.loc)
+ else
+ for(var/mob/M in viewers(1, master))
+ if(M.client)
+ attack_self(M)
+ else
+ usr << browse(null, "window=radio")
+ return
+ return
+
+/obj/item/clothing/accessory/collar/shock/receive_signal(datum/signal/signal)
+ if(!signal || signal.encryption != code)
+ return
+
+ if(on)
+ var/mob/M = null
+ if(ismob(loc))
+ M = loc
+ if(ismob(loc.loc))
+ M = loc.loc // This is about as terse as I can make my solution to the whole 'collar won't work when attached as accessory' thing.
+ M << "You feel a sharp shock!"
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(3, 1, M)
+ s.start()
+ M.Weaken(10)
+ return
+
+/obj/item/clothing/accessory/collar/shock/attack_self(mob/user as mob, flag1)
+ if(!istype(user, /mob/living/carbon/human))
+ return
+ user.set_machine(src)
+ var/dat = {"
+Turn [on ? "Off" : "On"]
+Frequency/Code for collar:
+Frequency:
+-
+- [format_frequency(frequency)]
++
++
+
+Code:
+-
+- [code]
++
++
+"}
+ user << browse(dat, "window=radio")
+ onclose(user, "radio")
+ return
+
/obj/item/clothing/accessory/collar/spike
name = "Spiked collar"
diff --git a/icons/obj/clothing/collars_vr.dmi b/icons/obj/clothing/collars_vr.dmi
index 0053dd4bc1..6717b4f236 100644
Binary files a/icons/obj/clothing/collars_vr.dmi and b/icons/obj/clothing/collars_vr.dmi differ