diff --git a/code/game/jobs/access_datum.dm b/code/game/jobs/access_datum.dm
index a43eaa1f0c0..c0300b973da 100644
--- a/code/game/jobs/access_datum.dm
+++ b/code/game/jobs/access_datum.dm
@@ -508,3 +508,9 @@ var/const/access_journalist = 70//journalist's office access
/datum/access/crate_cash
id = access_crate_cash
access_type = ACCESS_TYPE_NONE
+
+/var/const/access_none = -1
+/datum/access/none
+ id = access_none
+ access_type = ACCESS_TYPE_NONE
+
diff --git a/code/game/objects/items/devices/magnetic_lock.dm b/code/game/objects/items/devices/magnetic_lock.dm
index e34a9b810e8..8c8e8f1223c 100644
--- a/code/game/objects/items/devices/magnetic_lock.dm
+++ b/code/game/objects/items/devices/magnetic_lock.dm
@@ -19,6 +19,8 @@
var/status = 0
var/locked = 1
var/hacked = 0
+ var/invincible = FALSE
+ var/processpower = TRUE
var/constructionstate = 0
var/drain_per_second = 3
var/last_process_time = 0
@@ -49,6 +51,22 @@
desc += " It is painted with [department] colors."
update_icon()
+ var/obj/machinery/door/airlock/newtarget = (locate(/obj/machinery/door/airlock) in get_turf(src))
+ if(newtarget)
+ var/direction = reverse_direction(dir)
+ forceMove(get_step(newtarget.loc, reverse_direction(direction)))
+ for (var/obj/machinery/door/airlock/A in oview(1, newtarget))
+ var/rdir = get_dir(newtarget, A)
+ if (istype(A, newtarget.type) && (rdir == turn(direction, -90) || rdir == turn(direction, 90)))
+ if(!target_node1)
+ target_node1 = A
+ target_node1.bracer = src
+ else
+ target_node2 = A
+ target_node2.bracer = src
+
+ status = STATUS_ACTIVE
+ attach(newtarget)
/obj/item/device/magnetic_lock/examine(mob/user)
..(user)
@@ -72,9 +90,11 @@
to_chat(user, "You remove \the [powercell].")
powercell = null
setconstructionstate(2)
+ return TRUE
else if (anchored)
if (!locked)
detach()
+ return TRUE
else
to_chat(user, "\The [src] is locked in place!")
else
@@ -119,6 +139,8 @@
playsound(loc, "sound/weapons/Genhit.ogg", I.force*2.5, 1)
return
+ if(invincible)
+ return
switch (constructionstate)
if (0)
if (istype(I, /obj/item/weapon/card/emag))
@@ -208,6 +230,8 @@
return
/obj/item/device/magnetic_lock/process()
+ if(!processpower)
+ return
var/obj/item/weapon/cell/C = powercell // both of these are for viewing ease
var/obj/item/weapon/cell/BU = internal_cell
var/delta_sec = (world.time - last_process_time) / 10
@@ -300,15 +324,16 @@
target_node2.bracer = src
break
- user.visible_message("[user] attached [src] onto [newtarget] and flicks it on. The magnetic lock now seals [newtarget].", "You attached [src] onto [newtarget] and switched on the magnetic lock.")
user.drop_from_inventory(src, src.loc)
forceMove(get_step(newtarget.loc, reverse_direction(direction)))
set_dir(reverse_direction(direction))
status = STATUS_ACTIVE
attach(newtarget)
+ user.visible_message("[user] attached [src] onto [newtarget] and flicks it on. The magnetic lock now seals [newtarget].", "You attached [src] onto [newtarget] and switched on the magnetic lock.")
return
+
/obj/item/device/magnetic_lock/proc/setconstructionstate(var/newstate)
if (!powercell && newstate == 1)
setconstructionstate(2)
@@ -404,6 +429,8 @@
add_overlay("overlay_deconstruct_[constructionstate]")
/obj/item/device/magnetic_lock/proc/takedamage(var/damage)
+ if(invincible)
+ return
health -= rand(damage/2, damage)
if (damage >= 40 && prob(50))
@@ -419,6 +446,72 @@
if (prob(50))
spark(target ? target : src, 5, alldirs)
+/obj/item/device/magnetic_lock/keypad
+ name = "magnetic door lock"
+ desc = "A large, passcode locked device used for completely locking down airlocks."
+
+ req_access = list(access_none)
+
+ var/passcode = "open"
+ var/configurable = TRUE
+
+/obj/item/device/magnetic_lock/keypad/update_overlays()
+ ..()
+ switch (status)
+ if (STATUS_INACTIVE to STATUS_ACTIVE)
+ if(istype(src, /obj/item/device/magnetic_lock/keypad))
+ add_overlay("overlay_keypad")
+
+
+/obj/item/device/magnetic_lock/keypad/attack_self(mob/user as mob)
+ var/datum/vueui/ui = SSvueui.get_open_ui(user, src)
+ if(!ui)
+ if(locked)
+ ui = new(user, src, "misc-maglock", 300, 100, "Maglock", list())
+ else
+ ui = new(user, src, "misc-maglock-config", 300, 100, "Maglock configuration", list("passcode" = passcode))
+
+ ui.open()
+
+/obj/item/device/magnetic_lock/keypad/attack_hand(var/mob/user)
+ . = ..()
+ if(. || !locked)
+ return
+
+ attack_self(user)
+
+/obj/item/device/magnetic_lock/keypad/Topic(href, href_list)
+ var/datum/vueui/ui = href_list["vueui"]
+ if(!istype(ui))
+ return
+ if(href_list["passcode"])
+ if(lowertext(href_list["passcode"]) == passcode)
+ locked = !locked
+ playsound(src, 'sound/machines/ping.ogg', 30, 1)
+ var/msg = "buttons on \the [src] and it [locked ? "locks" : "unlocks"] with a beep."
+ var/pos_adj = "[usr.name] presses "
+ var/fp_adj = "You press "
+ usr.visible_message("[addtext(pos_adj, msg)]", "[addtext(fp_adj, msg)]")
+ update_icon()
+ ui.close()
+ else
+ playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1)
+ to_chat(usr, span("warning", "\The [src] buzzes as you enter passcode."))
+ return
+ if(href_list["set_passcode"])
+ if(!locked)
+ passcode = lowertext(href_list["set_passcode"])
+ ui.data["passcode"] = passcode
+ to_chat(usr, "New passcode has been set.")
+ ui.push_change()
+ if(href_list["lock"])
+ if(!locked)
+ locked = !locked
+ playsound(src, 'sound/machines/ping.ogg', 30, 1)
+ to_chat(usr, "You have locked \the [src].")
+ ui.close()
+ update_icon()
+
#undef STATUS_INACTIVE
#undef STATUS_ACTIVE
#undef STATUS_BROKEN
diff --git a/html/changelogs/karolis2011-keypadmaglocks.yml b/html/changelogs/karolis2011-keypadmaglocks.yml
new file mode 100644
index 00000000000..0cba71bc4d7
--- /dev/null
+++ b/html/changelogs/karolis2011-keypadmaglocks.yml
@@ -0,0 +1,4 @@
+author: Karolis2011
+delete-after: True
+changes:
+ - rscadd: "Added keypad magnetic lock that is locked using passcode, instead of ID access."
diff --git a/icons/obj/magnetic_locks.dmi b/icons/obj/magnetic_locks.dmi
index b5c8a09cca4..6b0e76ec905 100644
Binary files a/icons/obj/magnetic_locks.dmi and b/icons/obj/magnetic_locks.dmi differ
diff --git a/vueui/src/components/view/misc/maglock-config.vue b/vueui/src/components/view/misc/maglock-config.vue
new file mode 100644
index 00000000000..690437decbf
--- /dev/null
+++ b/vueui/src/components/view/misc/maglock-config.vue
@@ -0,0 +1,16 @@
+
+
+
+ Set
+ Lock
+
+
+
+
+
diff --git a/vueui/src/components/view/misc/maglock.vue b/vueui/src/components/view/misc/maglock.vue
new file mode 100644
index 00000000000..d05f01e31f3
--- /dev/null
+++ b/vueui/src/components/view/misc/maglock.vue
@@ -0,0 +1,17 @@
+
+
+
+ Submit
+
+
+
+
+