hijack implant

This commit is contained in:
Seris02
2020-01-18 18:04:31 +08:00
parent 1b927e6a01
commit 04b34ec8ed
74 changed files with 400 additions and 160 deletions

View File

@@ -110,6 +110,7 @@
#define TRAIT_NOHARDCRIT "nohardcrit" #define TRAIT_NOHARDCRIT "nohardcrit"
#define TRAIT_NOSOFTCRIT "nosoftcrit" #define TRAIT_NOSOFTCRIT "nosoftcrit"
#define TRAIT_MINDSHIELD "mindshield" #define TRAIT_MINDSHIELD "mindshield"
#define TRAIT_HIJACKER "hijacker"
#define TRAIT_SIXTHSENSE "sixthsense" #define TRAIT_SIXTHSENSE "sixthsense"
#define TRAIT_DISSECTED "dissected" #define TRAIT_DISSECTED "dissected"
#define TRAIT_FEARLESS "fearless" #define TRAIT_FEARLESS "fearless"

View File

@@ -544,6 +544,46 @@
cooldown = world.time cooldown = world.time
owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE) owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE)
/datum/action/item_action/removeAPCs
name = "Relinquish APC"
desc = "Let go of an APC, relinquish control back to the station."
icon_icon = 'icons/obj/implants.dmi'
button_icon_state = "hijackx"
/datum/action/item_action/removeAPCs/Trigger()
var/list/areas = list()
for (var/area/a in owner.siliconaccessareas)
areas += a.name
areas += "None"
var/removeAPC = input("Select an APC to remove:","Remove APC Control",1) in areas
if (removeAPC == "None")
return
var/area/area = owner.siliconaccessareas[areas.Find(removeAPC)]
var/obj/machinery/power/apc/apc = area.get_apc()
apc.hijacker = 0
apc.update_icon()
apc.set_hijacked_lighting()
owner.toggleSiliconAccessArea(area)
/datum/action/item_action/accessAPCs
name = "Access APC Interface"
desc = "Open the APC's interface."
icon_icon = 'icons/obj/implants.dmi'
button_icon_state = "hijacky"
/datum/action/item_action/accessAPCs/Trigger()
var/list/areas = list()
for (var/area/a in owner.siliconaccessareas)
areas += a.name
areas += "None"
var/accessAPC = input("Select an APC to access:","Access APC Interface",1) in areas
if (accessAPC == "None")
return
var/area/area = owner.siliconaccessareas[areas.Find(accessAPC)]
var/obj/machinery/power/apc/apc = area.get_apc()
apc.ui_interact(owner)
//Preset for spells //Preset for spells
/datum/action/spell_action /datum/action/spell_action
check_flags = 0 check_flags = 0

View File

@@ -52,7 +52,7 @@
/datum/wires/airlock/interactable(mob/user) /datum/wires/airlock/interactable(mob/user)
var/obj/machinery/door/airlock/A = holder var/obj/machinery/door/airlock/A = holder
if(!issilicon(user) && A.isElectrified() && A.shock(user, 100)) if(!hasSiliconAccessInArea(user,get_area(src)) && A.isElectrified() && A.shock(user, 100))
return FALSE return FALSE
if(A.panel_open) if(A.panel_open)
return TRUE return TRUE

View File

@@ -12,7 +12,7 @@
/datum/wires/vending/interactable(mob/user) /datum/wires/vending/interactable(mob/user)
var/obj/machinery/vending/V = holder var/obj/machinery/vending/V = holder
if(!issilicon(user) && V.seconds_electrified && V.shock(user, 100)) if(!hasSiliconAccessInArea(user,get_area(src)) && V.seconds_electrified && V.shock(user, 100))
return FALSE return FALSE
if(V.panel_open) if(V.panel_open)
return TRUE return TRUE

View File

@@ -182,7 +182,7 @@
/obj/machinery/sleeper/AltClick(mob/user) /obj/machinery/sleeper/AltClick(mob/user)
. = ..() . = ..()
if(!user.canUseTopic(src, !issilicon(user))) if(!user.canUseTopic(src, !hasSiliconAccessInArea(user,get_area(src))))
return return
if(state_open) if(state_open)
close_machine() close_machine()

View File

@@ -224,7 +224,7 @@ Class Procs:
return !(stat & (NOPOWER|BROKEN|MAINT)) return !(stat & (NOPOWER|BROKEN|MAINT))
/obj/machinery/can_interact(mob/user) /obj/machinery/can_interact(mob/user)
var/silicon = issiliconoradminghost(user) var/silicon = issiliconoradminghost(user) || hasSiliconAccessInArea(user,get_area(src))
if((stat & (NOPOWER|BROKEN)) && !(interaction_flags_machine & INTERACT_MACHINE_OFFLINE)) if((stat & (NOPOWER|BROKEN)) && !(interaction_flags_machine & INTERACT_MACHINE_OFFLINE))
return FALSE return FALSE
if(panel_open && !(interaction_flags_machine & INTERACT_MACHINE_OPEN)) if(panel_open && !(interaction_flags_machine & INTERACT_MACHINE_OPEN))

View File

@@ -105,7 +105,7 @@ GLOBAL_LIST_EMPTY(announcement_systems)
/obj/machinery/announcement_system/ui_interact(mob/user) /obj/machinery/announcement_system/ui_interact(mob/user)
. = ..() . = ..()
if(!user.canUseTopic(src, !issilicon(user))) if(!user.canUseTopic(src, !hasSiliconAccessInArea(user,get_area(src))))
return return
if(stat & BROKEN) if(stat & BROKEN)
visible_message("<span class='warning'>[src] buzzes.</span>", "<span class='italics'>You hear a faint buzz.</span>") visible_message("<span class='warning'>[src] buzzes.</span>", "<span class='italics'>You hear a faint buzz.</span>")
@@ -123,7 +123,7 @@ GLOBAL_LIST_EMPTY(announcement_systems)
/obj/machinery/announcement_system/Topic(href, href_list) /obj/machinery/announcement_system/Topic(href, href_list)
if(..()) if(..())
return return
if(!usr.canUseTopic(src, !issilicon(usr))) if(!usr.canUseTopic(src, !hasSiliconAccessInArea(usr,get_area(src))))
return return
if(stat & BROKEN) if(stat & BROKEN)
visible_message("<span class='warning'>[src] buzzes.</span>", "<span class='italics'>You hear a faint buzz.</span>") visible_message("<span class='warning'>[src] buzzes.</span>", "<span class='italics'>You hear a faint buzz.</span>")
@@ -132,13 +132,13 @@ GLOBAL_LIST_EMPTY(announcement_systems)
if(href_list["ArrivalTopic"]) if(href_list["ArrivalTopic"])
var/NewMessage = stripped_input(usr, "Enter in the arrivals announcement configuration.", "Arrivals Announcement Config", arrival) var/NewMessage = stripped_input(usr, "Enter in the arrivals announcement configuration.", "Arrivals Announcement Config", arrival)
if(!usr.canUseTopic(src, !issilicon(usr))) if(!usr.canUseTopic(src, !hasSiliconAccessInArea(usr,get_area(src))))
return return
if(NewMessage) if(NewMessage)
arrival = NewMessage arrival = NewMessage
else if(href_list["NewheadTopic"]) else if(href_list["NewheadTopic"])
var/NewMessage = stripped_input(usr, "Enter in the departmental head announcement configuration.", "Head Departmental Announcement Config", newhead) var/NewMessage = stripped_input(usr, "Enter in the departmental head announcement configuration.", "Head Departmental Announcement Config", newhead)
if(!usr.canUseTopic(src, !issilicon(usr))) if(!usr.canUseTopic(src, !hasSiliconAccessInArea(usr,get_area(src))))
return return
if(NewMessage) if(NewMessage)
newhead = NewMessage newhead = NewMessage
@@ -157,7 +157,7 @@ GLOBAL_LIST_EMPTY(announcement_systems)
. = attack_ai(user) . = attack_ai(user)
/obj/machinery/announcement_system/attack_ai(mob/user) /obj/machinery/announcement_system/attack_ai(mob/user)
if(!user.canUseTopic(src, !issilicon(user))) if(!user.canUseTopic(src, !hasSiliconAccessInArea(user,get_area(src))))
return return
if(stat & BROKEN) if(stat & BROKEN)
to_chat(user, "<span class='warning'>[src]'s firmware appears to be malfunctioning!</span>") to_chat(user, "<span class='warning'>[src]'s firmware appears to be malfunctioning!</span>")

View File

@@ -304,12 +304,12 @@
/obj/machinery/computer/arcade/minesweeper/proc/custom_generation(mob/user) /obj/machinery/computer/arcade/minesweeper/proc/custom_generation(mob/user)
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) //Entered into the menu so ping sound playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) //Entered into the menu so ping sound
var/new_rows = input(user, "How many rows do you want? (Minimum: 4, Maximum: 30)", "Minesweeper Rows") as null|num var/new_rows = input(user, "How many rows do you want? (Minimum: 4, Maximum: 30)", "Minesweeper Rows") as null|num
if(!new_rows || !user.canUseTopic(src, !issilicon(user))) if(!new_rows || !user.canUseTopic(src, !hasSiliconAccessInArea(user,get_area(src))))
return FALSE return FALSE
new_rows = CLAMP(new_rows + 1, 4, 30) new_rows = CLAMP(new_rows + 1, 4, 30)
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10)
var/new_columns = input(user, "How many columns do you want? (Minimum: 4, Maximum: 50)", "Minesweeper Squares") as null|num var/new_columns = input(user, "How many columns do you want? (Minimum: 4, Maximum: 50)", "Minesweeper Squares") as null|num
if(!new_columns || !user.canUseTopic(src, !issilicon(user))) if(!new_columns || !user.canUseTopic(src, !hasSiliconAccessInArea(user,get_area(src))))
return FALSE return FALSE
new_columns = CLAMP(new_columns + 1, 4, 50) new_columns = CLAMP(new_columns + 1, 4, 50)
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10)
@@ -317,7 +317,7 @@
var/lower_limit = round(grid_area*0.156) var/lower_limit = round(grid_area*0.156)
var/upper_limit = round(grid_area*0.85) var/upper_limit = round(grid_area*0.85)
var/new_mine_limit = input(user, "How many mines do you want? (Minimum: [lower_limit], Maximum: [upper_limit])", "Minesweeper Mines") as null|num var/new_mine_limit = input(user, "How many mines do you want? (Minimum: [lower_limit], Maximum: [upper_limit])", "Minesweeper Mines") as null|num
if(!new_mine_limit || !user.canUseTopic(src, !issilicon(user))) if(!new_mine_limit || !user.canUseTopic(src, !hasSiliconAccessInArea(user,get_area(src))))
return FALSE return FALSE
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10)
rows = new_rows rows = new_rows

View File

@@ -36,7 +36,7 @@
return ..() return ..()
/obj/machinery/computer/security/can_interact(mob/user) /obj/machinery/computer/security/can_interact(mob/user)
if((!issilicon(user) && !Adjacent(user)) || is_blind(user) || !in_view_range(user, src)) if((!hasSiliconAccessInArea(user,get_area(src)) && !Adjacent(user)) || is_blind(user) || !in_view_range(user, src))
return FALSE return FALSE
return ..() return ..()

View File

@@ -171,7 +171,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
/obj/machinery/computer/card/AltClick(mob/user) /obj/machinery/computer/card/AltClick(mob/user)
. = ..() . = ..()
if(!user.canUseTopic(src, !issilicon(user)) || !is_operational()) if(!user.canUseTopic(src, !hasSiliconAccessInArea(user,get_area(src))) || !is_operational())
return return
if(inserted_modify_id) if(inserted_modify_id)
if(id_eject(user, inserted_modify_id)) if(id_eject(user, inserted_modify_id))
@@ -360,7 +360,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
if(..()) if(..())
return return
if(!usr.canUseTopic(src, !issilicon(usr)) || !is_operational()) if(!usr.canUseTopic(src, !hasSiliconAccessInArea(usr,get_area(src))) || !is_operational())
usr.unset_machine() usr.unset_machine()
usr << browse(null, "window=id_com") usr << browse(null, "window=id_com")
return return
@@ -392,7 +392,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
inserted_scan_id = id_to_insert inserted_scan_id = id_to_insert
updateUsrDialog() updateUsrDialog()
if ("auth") if ("auth")
if ((!( authenticated ) && (inserted_scan_id || issilicon(usr)) || mode)) if ((!( authenticated ) && (inserted_scan_id || hasSiliconAccessInArea(usr,get_area(src))) || mode))
if (check_access(inserted_scan_id)) if (check_access(inserted_scan_id))
region_access = list() region_access = list()
head_subordinates = list() head_subordinates = list()
@@ -426,7 +426,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
get_subordinates("Quartermaster") get_subordinates("Quartermaster")
if(region_access) if(region_access)
authenticated = 1 authenticated = 1
else if ((!( authenticated ) && issilicon(usr)) && (!inserted_modify_id)) else if ((!( authenticated ) && hasSiliconAccessInArea(usr,get_area(src))) && (!inserted_modify_id))
to_chat(usr, "<span class='warning'>You can't modify an ID without an ID inserted to modify! Once one is in the modify slot on the computer, you can log in.</span>") to_chat(usr, "<span class='warning'>You can't modify an ID without an ID inserted to modify! Once one is in the modify slot on the computer, you can log in.</span>")
if ("logout") if ("logout")
region_access = null region_access = null
@@ -481,7 +481,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
if ("reg") if ("reg")
if (authenticated) if (authenticated)
var/t2 = inserted_modify_id var/t2 = inserted_modify_id
if ((authenticated && inserted_modify_id == t2 && (in_range(src, usr) || issilicon(usr)) && isturf(loc))) if ((authenticated && inserted_modify_id == t2 && (in_range(src, usr) || hasSiliconAccessInArea(usr,get_area(src))) && isturf(loc)))
var/newName = reject_bad_name(href_list["reg"]) var/newName = reject_bad_name(href_list["reg"])
if(newName) if(newName)
inserted_modify_id.registered_name = newName inserted_modify_id.registered_name = newName

View File

@@ -449,7 +449,7 @@
var/datum/browser/popup = new(user, "communications", "Communications Console", 400, 500) var/datum/browser/popup = new(user, "communications", "Communications Console", 400, 500)
popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) popup.set_title_image(user.browse_rsc_icon(icon, icon_state))
if(issilicon(user)) if(issilicon(user) || (hasSiliconAccessInArea(user,get_area(src)) && !in_range(user,src)))
var/dat2 = interact_ai(user) // give the AI a different interact proc to limit its access var/dat2 = interact_ai(user) // give the AI a different interact proc to limit its access
if(dat2) if(dat2)
dat += dat2 dat += dat2

View File

@@ -64,7 +64,7 @@
if(!user) if(!user)
return return
var/datum/browser/popup = new(user, "scannernew", "DNA Modifier Console", 800, 630) // Set up the popup browser window var/datum/browser/popup = new(user, "scannernew", "DNA Modifier Console", 800, 630) // Set up the popup browser window
if(!(in_range(src, user) || issilicon(user))) if(!(in_range(src, user) || hasSiliconAccessInArea(user,get_area(src))))
popup.close() popup.close()
return return
popup.add_stylesheet("scannernew", 'html/browser/scannernew.css') popup.add_stylesheet("scannernew", 'html/browser/scannernew.css')
@@ -308,7 +308,7 @@
return return
if(!isturf(usr.loc)) if(!isturf(usr.loc))
return return
if(!((isturf(loc) && in_range(src, usr)) || issilicon(usr))) if(!((isturf(loc) && in_range(src, usr)) || hasSiliconAccessInArea(usr,get_area(src))))
return return
if(current_screen == "working") if(current_screen == "working")
return return

View File

@@ -190,7 +190,7 @@
if(!(active2 in GLOB.data_core.medical)) if(!(active2 in GLOB.data_core.medical))
active2 = null active2 = null
if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr) || IsAdminGhost(usr)) if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || hasSiliconAccessInArea(usr,get_area(src)) || IsAdminGhost(usr))
usr.set_machine(src) usr.set_machine(src)
if(href_list["temp"]) if(href_list["temp"])
temp = null temp = null
@@ -216,7 +216,7 @@
else if(href_list["login"]) else if(href_list["login"])
var/mob/M = usr var/mob/M = usr
var/obj/item/card/id/I = M.get_idcard(TRUE) var/obj/item/card/id/I = M.get_idcard(TRUE)
if(issilicon(M)) if(hasSiliconAccessInArea(M,get_area(src)))
active1 = null active1 = null
active2 = null active2 = null
authenticated = 1 authenticated = 1
@@ -569,7 +569,7 @@
if(user) if(user)
if(message) if(message)
if(authenticated) if(authenticated)
if(user.canUseTopic(src, !issilicon(user))) if(user.canUseTopic(src, !hasSiliconAccessInArea(user,get_area(src))))
if(!record1 || record1 == active1) if(!record1 || record1 == active1)
if(!record2 || record2 == active2) if(!record2 || record2 == active2)
return 1 return 1

View File

@@ -86,7 +86,7 @@
/obj/machinery/computer/pod/Topic(href, href_list) /obj/machinery/computer/pod/Topic(href, href_list)
if(..()) if(..())
return return
if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr)) if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || hasSiliconAccessInArea(usr,get_area(src)))
usr.set_machine(src) usr.set_machine(src)
if(href_list["power"]) if(href_list["power"])
var/t = text2num(href_list["power"]) var/t = text2num(href_list["power"])

View File

@@ -87,7 +87,7 @@
/obj/machinery/computer/prisoner/management/Topic(href, href_list) /obj/machinery/computer/prisoner/management/Topic(href, href_list)
if(..()) if(..())
return return
if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr)) if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || hasSiliconAccessInArea(usr,get_area(src)))
usr.set_machine(src) usr.set_machine(src)
if(href_list["id"]) if(href_list["id"])

View File

@@ -265,7 +265,7 @@ What a mess.*/
active1 = null active1 = null
if(!( GLOB.data_core.security.Find(active2) )) if(!( GLOB.data_core.security.Find(active2) ))
active2 = null active2 = null
if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr) || IsAdminGhost(usr)) if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || hasSiliconAccessInArea(usr,get_area(src)) || IsAdminGhost(usr))
usr.set_machine(src) usr.set_machine(src)
switch(href_list["choice"]) switch(href_list["choice"])
// SORTING! // SORTING!
@@ -299,7 +299,7 @@ What a mess.*/
if("Log In") if("Log In")
var/mob/M = usr var/mob/M = usr
var/obj/item/card/id/I = M.get_idcard(TRUE) var/obj/item/card/id/I = M.get_idcard(TRUE)
if(issilicon(M)) if(hasSiliconAccessInArea(M,get_area(src)))
var/mob/living/silicon/borg = M var/mob/living/silicon/borg = M
active1 = null active1 = null
active2 = null active2 = null
@@ -802,7 +802,7 @@ What a mess.*/
/obj/machinery/computer/secure_data/proc/canUseSecurityRecordsConsole(mob/user, message1 = 0, record1, record2) /obj/machinery/computer/secure_data/proc/canUseSecurityRecordsConsole(mob/user, message1 = 0, record1, record2)
if(user) if(user)
if(authenticated) if(authenticated)
if(user.canUseTopic(src, !issilicon(user))) if(user.canUseTopic(src, !hasSiliconAccessInArea(user,get_area(src))))
if(!trim(message1)) if(!trim(message1))
return 0 return 0
if(!record1 || record1 == active1) if(!record1 || record1 == active1)

View File

@@ -141,7 +141,7 @@
L[avoid_assoc_duplicate_keys(M.real_name, areaindex)] = M L[avoid_assoc_duplicate_keys(M.real_name, areaindex)] = M
var/desc = input("Please select a location to lock in.", "Locking Computer") as null|anything in L var/desc = input("Please select a location to lock in.", "Locking Computer") as null|anything in L
if(!user.canUseTopic(src, !issilicon(user), NO_DEXTERY)) //check if we are still around if(!user.canUseTopic(src, !hasSiliconAccessInArea(user,get_area(src)), NO_DEXTERY)) //check if we are still around
return return
target = L[desc] target = L[desc]
if(imp_t) if(imp_t)
@@ -169,7 +169,7 @@
to_chat(user, "<span class='alert'>No active connected stations located.</span>") to_chat(user, "<span class='alert'>No active connected stations located.</span>")
return return
var/desc = input("Please select a station to lock in.", "Locking Computer") as null|anything in L var/desc = input("Please select a station to lock in.", "Locking Computer") as null|anything in L
if(!user.canUseTopic(src, !issilicon(user), NO_DEXTERY)) //again, check if we are still around if(!user.canUseTopic(src, !hasSiliconAccessInArea(user,get_area(src)), NO_DEXTERY)) //again, check if we are still around
return return
var/obj/machinery/teleport/station/target_station = L[desc] var/obj/machinery/teleport/station/target_station = L[desc]
if(!target_station || !target_station.teleporter_hub) if(!target_station || !target_station.teleporter_hub)

View File

@@ -53,7 +53,7 @@
/obj/machinery/jukebox/ui_interact(mob/user) /obj/machinery/jukebox/ui_interact(mob/user)
. = ..() . = ..()
if(!user.canUseTopic(src, !issilicon(user))) if(!user.canUseTopic(src, !hasSiliconAccessInArea(user,get_area(src))))
return return
if (!anchored) if (!anchored)
to_chat(user,"<span class='warning'>This device must be anchored by a wrench!</span>") to_chat(user,"<span class='warning'>This device must be anchored by a wrench!</span>")

View File

@@ -98,7 +98,7 @@
/obj/machinery/dish_drive/AltClick(mob/living/user) /obj/machinery/dish_drive/AltClick(mob/living/user)
. = ..() . = ..()
if(user.canUseTopic(src, !issilicon(user))) if(user.canUseTopic(src, !hasSiliconAccessInArea(user,get_area(src))))
do_the_dishes(TRUE) do_the_dishes(TRUE)
return TRUE return TRUE

View File

@@ -165,7 +165,7 @@
/obj/machinery/dna_scannernew/AltClick(mob/user) /obj/machinery/dna_scannernew/AltClick(mob/user)
. = ..() . = ..()
if(!user.canUseTopic(src, !issilicon(user))) if(!user.canUseTopic(src, !hasSiliconAccessInArea(user,get_area(src))))
return return
interact(user) interact(user)
return TRUE return TRUE

View File

@@ -676,7 +676,7 @@
else else
. += "It looks very robust." . += "It looks very robust."
if(issilicon(user) && (!stat & BROKEN)) if(hasSiliconAccessInArea(user,get_area(src)) && (!stat & BROKEN))
. += "<span class='notice'>Shift-click [src] to [ density ? "open" : "close"] it.</span>" . += "<span class='notice'>Shift-click [src] to [ density ? "open" : "close"] it.</span>"
. += "<span class='notice'>Ctrl-click [src] to [ locked ? "raise" : "drop"] its bolts.</span>" . += "<span class='notice'>Ctrl-click [src] to [ locked ? "raise" : "drop"] its bolts.</span>"
. += "<span class='notice'>Alt-click [src] to [ secondsElectrified ? "un-electrify" : "permanently electrify"] it.</span>" . += "<span class='notice'>Alt-click [src] to [ secondsElectrified ? "un-electrify" : "permanently electrify"] it.</span>"
@@ -1322,9 +1322,9 @@
if(density && !open(2)) //The airlock is still closed, but something prevented it opening. (Another player noticed and bolted/welded the airlock in time!) if(density && !open(2)) //The airlock is still closed, but something prevented it opening. (Another player noticed and bolted/welded the airlock in time!)
to_chat(user, "<span class='warning'>Despite your efforts, [src] managed to resist your attempts to open it!</span>") to_chat(user, "<span class='warning'>Despite your efforts, [src] managed to resist your attempts to open it!</span>")
/obj/machinery/door/airlock/hostile_lockdown(mob/origin) /obj/machinery/door/airlock/hostile_lockdown(mob/origin, aicontrolneeded = TRUE)
// Must be powered and have working AI wire. // Must be powered and have working AI wire.
if(canAIControl(src) && !stat) if((aicontrolneeded && canAIControl(src) && !stat) || !aicontrolneeded)
locked = FALSE //For airlocks that were bolted open. locked = FALSE //For airlocks that were bolted open.
safe = FALSE //DOOR CRUSH safe = FALSE //DOOR CRUSH
close() close()
@@ -1334,9 +1334,9 @@
LAZYADD(shockedby, "\[[TIME_STAMP("hh:mm:ss", FALSE)]\] [key_name(origin)]") LAZYADD(shockedby, "\[[TIME_STAMP("hh:mm:ss", FALSE)]\] [key_name(origin)]")
/obj/machinery/door/airlock/disable_lockdown() /obj/machinery/door/airlock/disable_lockdown(aicontrolneeded = TRUE)
// Must be powered and have working AI wire. // Must be powered and have working AI wire.
if(canAIControl(src) && !stat) if((aicontrolneeded && canAIControl(src) && !stat) || !aicontrolneeded)
unbolt() unbolt()
set_electrified(NOT_ELECTRIFIED) set_electrified(NOT_ELECTRIFIED)
open() open()
@@ -1587,7 +1587,7 @@
. = TRUE . = TRUE
/obj/machinery/door/airlock/proc/user_allowed(mob/user) /obj/machinery/door/airlock/proc/user_allowed(mob/user)
return (issilicon(user) && canAIControl(user)) || IsAdminGhost(user) return (hasSiliconAccessInArea(user,get_area(src)) && canAIControl(user)) || IsAdminGhost(user)
/obj/machinery/door/airlock/proc/shock_restore(mob/user) /obj/machinery/door/airlock/proc/shock_restore(mob/user)
if(!user_allowed(user)) if(!user_allowed(user))

View File

@@ -509,7 +509,7 @@ GLOBAL_LIST_EMPTY(allCasters)
/obj/machinery/newscaster/Topic(href, href_list) /obj/machinery/newscaster/Topic(href, href_list)
if(..()) if(..())
return return
if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && isturf(loc))) || issilicon(usr)) if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && isturf(loc))) || hasSiliconAccessInArea(usr,get_area(src)))
usr.set_machine(src) usr.set_machine(src)
scan_user(usr) scan_user(usr)
if(href_list["set_channel_name"]) if(href_list["set_channel_name"])

View File

@@ -839,7 +839,7 @@
/obj/machinery/turretid/examine(mob/user) /obj/machinery/turretid/examine(mob/user)
. = ..() . = ..()
if(issilicon(user) && (!stat & BROKEN)) if(hasSiliconAccessInArea(user,get_area(src)) && (!stat & BROKEN))
. += "<span class='notice'>Ctrl-click [src] to [ enabled ? "disable" : "enable"] turrets.</span>" . += "<span class='notice'>Ctrl-click [src] to [ enabled ? "disable" : "enable"] turrets.</span>"
. += "<span class='notice'>Alt-click [src] to set turrets to [ lethal ? "stun" : "kill"].</span>" . += "<span class='notice'>Alt-click [src] to set turrets to [ lethal ? "stun" : "kill"].</span>"
@@ -854,7 +854,7 @@
to_chat(user, "You link \the [M.buffer] with \the [src]") to_chat(user, "You link \the [M.buffer] with \the [src]")
return return
if (issilicon(user)) if (hasSiliconAccessInArea(user,get_area(src)))
return attack_hand(user) return attack_hand(user)
if ( get_dist(src, user) == 0 ) // trying to unlock the interface if ( get_dist(src, user) == 0 ) // trying to unlock the interface
@@ -895,7 +895,7 @@
/obj/machinery/turretid/ui_interact(mob/user) /obj/machinery/turretid/ui_interact(mob/user)
. = ..() . = ..()
if ( get_dist(src, user) > 0 ) if ( get_dist(src, user) > 0 )
if ( !(issilicon(user) || IsAdminGhost(user)) ) if ( !(hasSiliconAccessInArea(user,get_area(src)) || IsAdminGhost(user)) )
to_chat(user, "<span class='notice'>You are too far away.</span>") to_chat(user, "<span class='notice'>You are too far away.</span>")
user.unset_machine() user.unset_machine()
user << browse(null, "window=turretid") user << browse(null, "window=turretid")
@@ -903,10 +903,10 @@
var/t = "" var/t = ""
if(locked && !(issilicon(user) || IsAdminGhost(user))) if(locked && !(hasSiliconAccessInArea(user,get_area(src)) || IsAdminGhost(user)))
t += "<div class='notice icon'>Swipe ID card to unlock interface</div>" t += "<div class='notice icon'>Swipe ID card to unlock interface</div>"
else else
if(!issilicon(user) && !IsAdminGhost(user)) if(!hasSiliconAccessInArea(user,get_area(src)) && !IsAdminGhost(user))
t += "<div class='notice icon'>Swipe ID card to lock interface</div>" t += "<div class='notice icon'>Swipe ID card to lock interface</div>"
t += "Turrets [enabled?"activated":"deactivated"] - <A href='?src=[REF(src)];toggleOn=1'>[enabled?"Disable":"Enable"]?</a><br>" t += "Turrets [enabled?"activated":"deactivated"] - <A href='?src=[REF(src)];toggleOn=1'>[enabled?"Disable":"Enable"]?</a><br>"
t += "Currently set for [lethal?"lethal":"stun repeatedly"] - <A href='?src=[REF(src)];toggleLethal=1'>Change to [lethal?"Stun repeatedly":"Lethal"]?</a><br>" t += "Currently set for [lethal?"lethal":"stun repeatedly"] - <A href='?src=[REF(src)];toggleLethal=1'>Change to [lethal?"Stun repeatedly":"Lethal"]?</a><br>"
@@ -920,7 +920,7 @@
if(..()) if(..())
return return
if (locked) if (locked)
if(!(issilicon(usr) || IsAdminGhost(usr))) if(!(hasSiliconAccessInArea(usr,get_area(src)) || IsAdminGhost(usr)))
to_chat(usr, "Control panel is locked!") to_chat(usr, "Control panel is locked!")
return return
if (href_list["toggleOn"]) if (href_list["toggleOn"])

View File

@@ -121,7 +121,7 @@
. = ..() . = ..()
if(.) if(.)
return return
if(locked && !issilicon(user)) if(locked && !hasSiliconAccessInArea(user,get_area(src)))
to_chat(user, "<span class='warning'>The machine is locked, you are unable to use it!</span>") to_chat(user, "<span class='warning'>The machine is locked, you are unable to use it!</span>")
return return
if(panel_open) if(panel_open)
@@ -367,7 +367,7 @@
if(!anchored) if(!anchored)
to_chat(user, "<span class='warning'>\The [src] needs to be firmly secured to the floor first!</span>") to_chat(user, "<span class='warning'>\The [src] needs to be firmly secured to the floor first!</span>")
return return
if(locked && !issilicon(user)) if(locked && !hasSiliconAccessInArea(user,get_area(src)))
to_chat(user, "<span class='warning'>The controls are locked!</span>") to_chat(user, "<span class='warning'>The controls are locked!</span>")
return return
if(!power) if(!power)

View File

@@ -196,7 +196,7 @@
var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network)
if(newnet && ((usr in range(1, src)) || issilicon(usr))) if(newnet && ((usr in range(1, src)) || hasSiliconAccessInArea(usr,get_area(src))))
if(length(newnet) > 15) if(length(newnet) > 15)
temp = "<font color = #D70B00>- FAILED: NETWORK TAG STRING TOO LENGHTLY -</font color>" temp = "<font color = #D70B00>- FAILED: NETWORK TAG STRING TOO LENGHTLY -</font color>"

View File

@@ -260,7 +260,7 @@
if(..()) if(..())
return return
if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr)) if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || hasSiliconAccessInArea(usr,get_area(src)))
//Authenticate //Authenticate
if (href_list["auth"]) if (href_list["auth"])
if(LINKED_SERVER_NONRESPONSIVE) if(LINKED_SERVER_NONRESPONSIVE)

View File

@@ -108,7 +108,7 @@
if(href_list["network"]) if(href_list["network"])
var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network)
if(newnet && ((usr in range(1, src)) || issilicon(usr))) if(newnet && ((usr in range(1, src)) || hasSiliconAccessInArea(usr,get_area(src))))
if(length(newnet) > 15) if(length(newnet) > 15)
temp = "<font color = #D70B00>- FAILED: NETWORK TAG STRING TOO LENGHTLY -</font color>" temp = "<font color = #D70B00>- FAILED: NETWORK TAG STRING TOO LENGHTLY -</font color>"

View File

@@ -30,7 +30,7 @@
/obj/machinery/telecomms/ui_interact(mob/user) /obj/machinery/telecomms/ui_interact(mob/user)
. = ..() . = ..()
// You need a multitool to use this, or be silicon // You need a multitool to use this, or be silicon
if(!issilicon(user)) if(!hasSiliconAccessInArea(user,get_area(src)))
// istype returns false if the value is null // istype returns false if the value is null
if(!istype(user.get_active_held_item(), /obj/item/multitool)) if(!istype(user.get_active_held_item(), /obj/item/multitool))
return return
@@ -97,7 +97,7 @@
var/obj/item/multitool/P = null var/obj/item/multitool/P = null
// Let's double check // Let's double check
if(!issilicon(user) && istype(user.get_active_held_item(), /obj/item/multitool)) if(!hasSiliconAccessInArea(user,get_area(src)) && istype(user.get_active_held_item(), /obj/item/multitool))
P = user.get_active_held_item() P = user.get_active_held_item()
else if(isAI(user)) else if(isAI(user))
var/mob/living/silicon/ai/U = user var/mob/living/silicon/ai/U = user
@@ -162,7 +162,7 @@
if(..()) if(..())
return return
if(!issilicon(usr)) if(!hasSiliconAccessInArea(usr,get_area(src)))
if(!istype(usr.get_active_held_item(), /obj/item/multitool)) if(!istype(usr.get_active_held_item(), /obj/item/multitool))
return return
@@ -270,6 +270,6 @@
updateUsrDialog() updateUsrDialog()
/obj/machinery/telecomms/proc/canAccess(mob/user) /obj/machinery/telecomms/proc/canAccess(mob/user)
if(issilicon(user) || in_range(user, src)) if(hasSiliconAccessInArea(user,get_area(src)) || in_range(user, src))
return TRUE return TRUE
return FALSE return FALSE

View File

@@ -27,7 +27,7 @@
/obj/machinery/transformer/examine(mob/user) /obj/machinery/transformer/examine(mob/user)
. = ..() . = ..()
if(cooldown && (issilicon(user) || isobserver(user))) if(cooldown && (hasSiliconAccessInArea(user,get_area(src)) || isobserver(user)))
. += "It will be ready in [DisplayTimeText(cooldown_timer - world.time)]." . += "It will be ready in [DisplayTimeText(cooldown_timer - world.time)]."
/obj/machinery/transformer/Destroy() /obj/machinery/transformer/Destroy()

View File

@@ -701,7 +701,7 @@ GLOBAL_LIST_EMPTY(PDAs)
return return
/obj/item/pda/proc/remove_id(mob/user) /obj/item/pda/proc/remove_id(mob/user)
if(issilicon(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) if(hasSiliconAccessInArea(user,get_area(src)) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return return
do_remove_id(user) do_remove_id(user)
@@ -869,7 +869,7 @@ GLOBAL_LIST_EMPTY(PDAs)
remove_pen() remove_pen()
/obj/item/pda/proc/toggle_light() /obj/item/pda/proc/toggle_light()
if(issilicon(usr) || !usr.canUseTopic(src, BE_CLOSE)) if(hasSiliconAccessInArea(usr,get_area(src)) || !usr.canUseTopic(src, BE_CLOSE))
return return
if(fon) if(fon)
fon = FALSE fon = FALSE
@@ -881,7 +881,7 @@ GLOBAL_LIST_EMPTY(PDAs)
/obj/item/pda/proc/remove_pen() /obj/item/pda/proc/remove_pen()
if(issilicon(usr) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) if(hasSiliconAccessInArea(usr,get_area(src)) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return return
if(inserted_item) if(inserted_item)

View File

@@ -587,7 +587,7 @@ Code:
/obj/item/cartridge/Topic(href, href_list) /obj/item/cartridge/Topic(href, href_list)
..() ..()
if(!usr.canUseTopic(src, !issilicon(usr))) if(!usr.canUseTopic(src, !hasSiliconAccessInArea(usr,get_area(src))))
usr.unset_machine() usr.unset_machine()
usr << browse(null, "window=pda") usr << browse(null, "window=pda")
return return

View File

@@ -0,0 +1,75 @@
#define HIJACK_APC_MAX_AMOUNT 4
/obj/item/implant/hijack
name = "hijack implant"
desc = "Allows you to control the machinery in a room by hacking into the APC."
actions_types = list(/datum/action/item_action/hands_free/activate, /datum/action/item_action/removeAPCs, /datum/action/item_action/accessAPCs)
activated = 1
var/toggled = FALSE
icon_state = "hijack"
var/eye_color
/obj/item/implant/hijack/activate()
. = ..()
toggled = !toggled
if (toggled)
imp_in.click_intercept = src
imp_in.siliconaccesstoggle = TRUE
to_chat(imp_in,"<span class='notice'>You turn on [src]'s silicon interactions.</span>")
if (ishuman(imp_in))
var/mob/living/carbon/human/H = imp_in
H.eye_color = "ff0"
H.dna.update_ui_block(DNA_EYE_COLOR_BLOCK)
H.update_body()
else
imp_in.click_intercept = null
imp_in.siliconaccesstoggle = FALSE
to_chat(imp_in,"<span class='notice'>You turn off [src]'s silicon interactions.</span>")
if (ishuman(imp_in))
var/mob/living/carbon/human/H = imp_in
H.eye_color = eye_color
H.dna.update_ui_block(DNA_EYE_COLOR_BLOCK)
H.update_body()
/obj/item/implant/hijack/implant(mob/living/target, mob/user, silent = FALSE)
if(..())
ADD_TRAIT(target, TRAIT_HIJACKER, "implant")
if (ishuman(target))
var/mob/living/carbon/human/H = target
eye_color = H.eye_color
return TRUE
/obj/item/implant/hijack/removed(mob/target, silent = FALSE, special = 0)
if(..())
REMOVE_TRAIT(target, TRAIT_HIJACKER, "implant")
if (ishuman(target))
var/mob/living/carbon/human/H = target
H.eye_color = eye_color
return TRUE
/obj/item/implant/hijack/proc/InterceptClickOn(mob/living/user,params,atom/object)
if (!toggled)
return
if (user.get_active_held_item())
return
if (isitem(object))
return
var/area/a = get_area(object)
if (!hasSiliconAccessInArea(imp_in,a))
return
var/list/modifiers = params2list(params)
imp_in.face_atom(object)
if (modifiers["shift"] && modifiers["ctrl"])
object.AICtrlShiftClick(imp_in)
return TRUE
if (modifiers["shift"])
object.AIShiftClick(imp_in)
return TRUE
if (modifiers["ctrl"])
object.AICtrlClick(imp_in)
return TRUE
if (modifiers["alt"])
object.AIAltClick(imp_in)
return TRUE
object.attack_ai(imp_in)
return TRUE

View File

@@ -74,4 +74,8 @@
/obj/item/implanter/stealth /obj/item/implanter/stealth
name = "implanter (stealth)" name = "implanter (stealth)"
imp_type = /obj/item/implant/stealth imp_type = /obj/item/implant/stealth
/obj/item/implanter/hijack
name = "implanter (hijack)"
imp_type = /obj/item/implant/hijack

View File

@@ -125,7 +125,7 @@
if ((M.client && M.machine == src)) if ((M.client && M.machine == src))
is_in_use = TRUE is_in_use = TRUE
ui_interact(M) ui_interact(M)
if(isAI(usr) || iscyborg(usr) || IsAdminGhost(usr)) if(isAI(usr) || iscyborg(usr) || IsAdminGhost(usr) || hasSiliconAccessInArea(usr,get_area(src)))
if (!(usr in nearby)) if (!(usr in nearby))
if (usr.client && usr.machine==src) // && M.machine == src is omitted because if we triggered this by using the dialog, it doesn't matter if our machine changed in between triggering it and this - the dialog is probably still supposed to refresh. if (usr.client && usr.machine==src) // && M.machine == src is omitted because if we triggered this by using the dialog, it doesn't matter if our machine changed in between triggering it and this - the dialog is probably still supposed to refresh.
is_in_use = TRUE is_in_use = TRUE

View File

@@ -168,7 +168,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
/obj/structure/bodycontainer/morgue/AltClick(mob/user) /obj/structure/bodycontainer/morgue/AltClick(mob/user)
. = ..() . = ..()
if(!user.canUseTopic(src, !issilicon(user))) if(!user.canUseTopic(src, !hasSiliconAccessInArea(user,get_area(src))))
return return
beeper = !beeper beeper = !beeper
to_chat(user, "<span class='notice'>You turn the speaker function [beeper ? "on" : "off"].</span>") to_chat(user, "<span class='notice'>You turn the speaker function [beeper ? "on" : "off"].</span>")

View File

@@ -245,7 +245,7 @@
/obj/machinery/airalarm/ui_data(mob/user) /obj/machinery/airalarm/ui_data(mob/user)
var/data = list( var/data = list(
"locked" = locked, "locked" = locked,
"siliconUser" = user.has_unlimited_silicon_privilege, "siliconUser" = user.has_unlimited_silicon_privilege || hasSiliconAccessInArea(user,get_area(src)),
"emagged" = (obj_flags & EMAGGED ? 1 : 0), "emagged" = (obj_flags & EMAGGED ? 1 : 0),
"danger_level" = danger_level, "danger_level" = danger_level,
) )
@@ -288,7 +288,7 @@
"danger_level" = cur_tlv.get_danger_level(environment.gases[gas_id] * partial_pressure) "danger_level" = cur_tlv.get_danger_level(environment.gases[gas_id] * partial_pressure)
)) ))
if(!locked || user.has_unlimited_silicon_privilege) if(!locked || user.has_unlimited_silicon_privilege || hasSiliconAccessInArea(user,get_area(src)))
data["vents"] = list() data["vents"] = list()
for(var/id_tag in A.air_vent_names) for(var/id_tag in A.air_vent_names)
var/long_name = A.air_vent_names[id_tag] var/long_name = A.air_vent_names[id_tag]
@@ -368,7 +368,7 @@
/obj/machinery/airalarm/ui_act(action, params) /obj/machinery/airalarm/ui_act(action, params)
if(..() || buildstage != 2) if(..() || buildstage != 2)
return return
if((locked && !usr.has_unlimited_silicon_privilege) || (usr.has_unlimited_silicon_privilege && aidisabled)) if((locked && !usr.has_unlimited_silicon_privilege && !hasSiliconAccessInArea(usr,get_area(src))) || (usr.has_unlimited_silicon_privilege && aidisabled))
return return
var/device_id = params["id_tag"] var/device_id = params["id_tag"]
switch(action) switch(action)
@@ -839,7 +839,7 @@
/obj/machinery/airalarm/AltClick(mob/user) /obj/machinery/airalarm/AltClick(mob/user)
. = ..() . = ..()
if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc)) if(!user.canUseTopic(src, !hasSiliconAccessInArea(user,get_area(src))) || !isturf(loc))
return return
togglelock(user) togglelock(user)
return TRUE return TRUE

View File

@@ -44,7 +44,7 @@
return return
if(reload < reload_cooldown) if(reload < reload_cooldown)
return return
if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr)) if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || hasSiliconAccessInArea(usr,get_area(src)))
priority_announce("Bluespace artillery fire detected. Brace for impact.") priority_announce("Bluespace artillery fire detected. Brace for impact.")
message_admins("[ADMIN_LOOKUPFLW(usr)] has launched an artillery strike.") message_admins("[ADMIN_LOOKUPFLW(usr)] has launched an artillery strike.")
var/list/L = list() var/list/L = list()

View File

@@ -77,7 +77,7 @@
/obj/item/supplypod_beacon/AltClick(mob/user) /obj/item/supplypod_beacon/AltClick(mob/user)
. = ..() . = ..()
if (!user.canUseTopic(src, !issilicon(user))) if (!user.canUseTopic(src, !hasSiliconAccessInArea(user,get_area(src))))
return return
if (express_console) if (express_console)
unlink_console() unlink_console()

View File

@@ -140,7 +140,7 @@
/obj/item/valentine/examine(mob/user) /obj/item/valentine/examine(mob/user)
. = ..() . = ..()
if(in_range(user, src) || isobserver(user)) if(in_range(user, src) || isobserver(user))
if( !(ishuman(user) || isobserver(user) || issilicon(user)) ) if( !(ishuman(user) || isobserver(user) || hasSiliconAccessInArea(user,get_area(src))) )
user << browse("<HTML><HEAD><TITLE>[name]</TITLE></HEAD><BODY>[stars(message)]</BODY></HTML>", "window=[name]") user << browse("<HTML><HEAD><TITLE>[name]</TITLE></HEAD><BODY>[stars(message)]</BODY></HTML>", "window=[name]")
onclose(user, "[name]") onclose(user, "[name]")
else else

View File

@@ -55,7 +55,7 @@
if(!operating) if(!operating)
. += "<span class='notice'>Alt-click [src] to turn it on.</span>" . += "<span class='notice'>Alt-click [src] to turn it on.</span>"
if(!in_range(user, src) && !issilicon(user) && !isobserver(user)) if(!in_range(user, src) && !hasSiliconAccessInArea(user,get_area(src)) && !isobserver(user))
. += "<span class='warning'>You're too far away to examine [src]'s contents and display!</span>" . += "<span class='warning'>You're too far away to examine [src]'s contents and display!</span>"
return return
if(operating) if(operating)
@@ -63,7 +63,7 @@
return return
if(length(ingredients)) if(length(ingredients))
if(issilicon(user)) if(hasSiliconAccessInArea(user,get_area(src)))
. += "<span class='notice'>\The [src] camera shows:</span>" . += "<span class='notice'>\The [src] camera shows:</span>"
else else
. += "<span class='notice'>\The [src] contains:</span>" . += "<span class='notice'>\The [src] contains:</span>"
@@ -187,14 +187,14 @@
/obj/machinery/microwave/AltClick(mob/user) /obj/machinery/microwave/AltClick(mob/user)
. = ..() . = ..()
if(user.canUseTopic(src, !issilicon(usr))) if(user.canUseTopic(src, !hasSiliconAccessInArea(user,get_area(src))))
cook() cook()
return TRUE return TRUE
/obj/machinery/microwave/ui_interact(mob/user) /obj/machinery/microwave/ui_interact(mob/user)
. = ..() . = ..()
if(operating || panel_open || !anchored || !user.canUseTopic(src, !issilicon(user))) if(operating || panel_open || !anchored || !user.canUseTopic(src, !hasSiliconAccessInArea(user,get_area(src))))
return return
if(isAI(user) && (stat & NOPOWER)) if(isAI(user) && (stat & NOPOWER))
return return
@@ -206,10 +206,10 @@
to_chat(user, "<span class='warning'>\The [src] is empty.</span>") to_chat(user, "<span class='warning'>\The [src] is empty.</span>")
return return
var/choice = show_radial_menu(user, src, isAI(user) ? ai_radial_options : radial_options, require_near = !issilicon(user)) var/choice = show_radial_menu(user, src, isAI(user) ? ai_radial_options : radial_options, require_near = !hasSiliconAccessInArea(user,get_area(src)))
// post choice verification // post choice verification
if(operating || panel_open || !anchored || !user.canUseTopic(src, !issilicon(user))) if(operating || panel_open || !anchored || !user.canUseTopic(src, !hasSiliconAccessInArea(user,get_area(src))))
return return
if(isAI(user) && (stat & NOPOWER)) if(isAI(user) && (stat & NOPOWER))
return return

View File

@@ -92,7 +92,7 @@
data["emagged"] = TRUE data["emagged"] = TRUE
data["emag_programs"] = emag_programs data["emag_programs"] = emag_programs
data["program"] = program data["program"] = program
data["can_toggle_safety"] = issilicon(user) || IsAdminGhost(user) data["can_toggle_safety"] = hasSiliconAccessInArea(user,get_area(src)) || IsAdminGhost(user)
return data return data
@@ -109,7 +109,7 @@
if(A) if(A)
load_program(A) load_program(A)
if("safety") if("safety")
if(!issilicon(usr) && !IsAdminGhost(usr)) if(!hasSiliconAccessInArea(usr,get_area(src)) && !IsAdminGhost(usr))
var/msg = "[key_name(usr)] attempted to emag the holodeck using a href they shouldn't have!" var/msg = "[key_name(usr)] attempted to emag the holodeck using a href they shouldn't have!"
message_admins(msg) message_admins(msg)
log_admin(msg) log_admin(msg)

View File

@@ -105,7 +105,7 @@
return return
var/datum/browser/popup = new(user, "plantdna", "Plant DNA Manipulator", 450, 600) var/datum/browser/popup = new(user, "plantdna", "Plant DNA Manipulator", 450, 600)
if(!(in_range(src, user) || issilicon(user))) if(!(in_range(src, user) || hasSiliconAccessInArea(user,get_area(src))))
popup.close() popup.close()
return return

View File

@@ -107,7 +107,7 @@
interact(user) interact(user)
/obj/item/integrated_circuit_printer/interact(mob/user) /obj/item/integrated_circuit_printer/interact(mob/user)
if(!(in_range(src, user) || issilicon(user))) if(!(in_range(src, user) || hasSiliconAccessInArea(user,get_area(src))))
return return
if(isnull(current_category)) if(isnull(current_category))

View File

@@ -4,7 +4,7 @@
//check if it doesn't require any access at all //check if it doesn't require any access at all
if(src.check_access(null)) if(src.check_access(null))
return TRUE return TRUE
if(issilicon(M)) if(hasSiliconAccessInArea(M,get_area(src)))
if(ispAI(M)) if(ispAI(M))
return FALSE return FALSE
return TRUE //AI can do whatever it wants return TRUE //AI can do whatever it wants

View File

@@ -99,6 +99,8 @@
. += "[t_He] [t_has] [glasses.get_examine_string(user)] covering [t_his] eyes." . += "[t_He] [t_has] [glasses.get_examine_string(user)] covering [t_his] eyes."
else if(eye_color == BLOODCULT_EYE && iscultist(src) && HAS_TRAIT(src, TRAIT_CULT_EYES)) else if(eye_color == BLOODCULT_EYE && iscultist(src) && HAS_TRAIT(src, TRAIT_CULT_EYES))
. += "<span class='warning'><B>[t_His] eyes are glowing an unnatural red!</B></span>" . += "<span class='warning'><B>[t_His] eyes are glowing an unnatural red!</B></span>"
else if(eye_color == "ff0" && HAS_TRAIT(src, TRAIT_HIJACKER))
. += "<b><font color=orange>[t_His] eyes are flickering a bright yellow!</font></b>"
//ears //ears
if(ears && !(SLOT_EARS in obscured)) if(ears && !(SLOT_EARS in obscured))

View File

@@ -809,14 +809,14 @@ Pass a positive integer as an argument to override a bot's default speed.
switch(href_list["operation"]) switch(href_list["operation"])
if("patrol") if("patrol")
if(!issilicon(usr) && !IsAdminGhost(usr) && !(bot_core.allowed(usr) || !locked)) if(!hasSiliconAccessInArea(usr,get_area(src)) && !IsAdminGhost(usr) && !(bot_core.allowed(usr) || !locked))
return TRUE return TRUE
auto_patrol = !auto_patrol auto_patrol = !auto_patrol
bot_reset() bot_reset()
if("remote") if("remote")
remote_disabled = !remote_disabled remote_disabled = !remote_disabled
if("hack") if("hack")
if(!issilicon(usr) && !IsAdminGhost(usr)) if(!hasSiliconAccessInArea(usr,get_area(src)) && !IsAdminGhost(usr))
var/msg = "[key_name(usr)] attempted to hack a bot with a href that shouldn't be available!" var/msg = "[key_name(usr)] attempted to hack a bot with a href that shouldn't be available!"
message_admins(msg) message_admins(msg)
log_admin(msg) log_admin(msg)
@@ -835,7 +835,7 @@ Pass a positive integer as an argument to override a bot's default speed.
to_chat(usr, "<span class='notice'>[text_dehack]</span>") to_chat(usr, "<span class='notice'>[text_dehack]</span>")
bot_reset() bot_reset()
if("ejectpai") if("ejectpai")
if(paicard && (!locked || issilicon(usr) || IsAdminGhost(usr))) if(paicard && (!locked || hasSiliconAccessInArea(usr,get_area(src)) || IsAdminGhost(usr)))
to_chat(usr, "<span class='notice'>You eject [paicard] from [bot_name]</span>") to_chat(usr, "<span class='notice'>You eject [paicard] from [bot_name]</span>")
ejectpai(usr) ejectpai(usr)
update_controls() update_controls()
@@ -862,13 +862,13 @@ Pass a positive integer as an argument to override a bot's default speed.
if(emagged == 2) //An emagged bot cannot be controlled by humans, silicons can if one hacked it. if(emagged == 2) //An emagged bot cannot be controlled by humans, silicons can if one hacked it.
if(!hacked) //Manually emagged by a human - access denied to all. if(!hacked) //Manually emagged by a human - access denied to all.
return TRUE return TRUE
else if(!issilicon(user) && !IsAdminGhost(user)) //Bot is hacked, so only silicons and admins are allowed access. else if(!hasSiliconAccessInArea(user,get_area(src)) && !IsAdminGhost(user)) //Bot is hacked, so only silicons and admins are allowed access.
return TRUE return TRUE
return FALSE return FALSE
/mob/living/simple_animal/bot/proc/hack(mob/user) /mob/living/simple_animal/bot/proc/hack(mob/user)
var/hack var/hack
if(issilicon(user) || IsAdminGhost(user)) //Allows silicons or admins to toggle the emag status of a bot. if(hasSiliconAccessInArea(user,get_area(src)) || IsAdminGhost(user)) //Allows silicons or admins to toggle the emag status of a bot.
hack += "[emagged == 2 ? "Software compromised! Unit may exhibit dangerous or erratic behavior." : "Unit operating normally. Release safety lock?"]<BR>" hack += "[emagged == 2 ? "Software compromised! Unit may exhibit dangerous or erratic behavior." : "Unit operating normally. Release safety lock?"]<BR>"
hack += "Harm Prevention Safety System: <A href='?src=[REF(src)];operation=hack'>[emagged ? "<span class='bad'>DANGER</span>" : "Engaged"]</A><BR>" hack += "Harm Prevention Safety System: <A href='?src=[REF(src)];operation=hack'>[emagged ? "<span class='bad'>DANGER</span>" : "Engaged"]</A><BR>"
else if(!locked) //Humans with access can use this option to hide a bot from the AI's remote control panel and PDA control. else if(!locked) //Humans with access can use this option to hide a bot from the AI's remote control panel and PDA control.
@@ -877,7 +877,7 @@ Pass a positive integer as an argument to override a bot's default speed.
/mob/living/simple_animal/bot/proc/showpai(mob/user) /mob/living/simple_animal/bot/proc/showpai(mob/user)
var/eject = "" var/eject = ""
if((!locked || issilicon(usr) || IsAdminGhost(usr))) if((!locked || hasSiliconAccessInArea(usr,get_area(src)) || IsAdminGhost(usr)))
if(paicard || allow_pai) if(paicard || allow_pai)
eject += "Personality card status: " eject += "Personality card status: "
if(paicard) if(paicard)

View File

@@ -296,7 +296,7 @@
Status: <A href='?src=[REF(src)];power=1'>[on ? "On" : "Off"]</A><BR> Status: <A href='?src=[REF(src)];power=1'>[on ? "On" : "Off"]</A><BR>
Behaviour controls are [locked ? "locked" : "unlocked"]<BR> Behaviour controls are [locked ? "locked" : "unlocked"]<BR>
Maintenance panel panel is [open ? "opened" : "closed"]"}) Maintenance panel panel is [open ? "opened" : "closed"]"})
if(!locked || issilicon(user)|| IsAdminGhost(user)) if(!locked || hasSiliconAccessInArea(user,get_area(src))|| IsAdminGhost(user))
dat += "<BR>Clean Blood: <A href='?src=[REF(src)];operation=blood'>[blood ? "Yes" : "No"]</A>" dat += "<BR>Clean Blood: <A href='?src=[REF(src)];operation=blood'>[blood ? "Yes" : "No"]</A>"
dat += "<BR>Clean Trash: <A href='?src=[REF(src)];operation=trash'>[trash ? "Yes" : "No"]</A>" dat += "<BR>Clean Trash: <A href='?src=[REF(src)];operation=trash'>[trash ? "Yes" : "No"]</A>"
dat += "<BR>Exterminate Pests: <A href='?src=[REF(src)];operation=pests'>[pests ? "Yes" : "No"]</A>" dat += "<BR>Exterminate Pests: <A href='?src=[REF(src)];operation=pests'>[pests ? "Yes" : "No"]</A>"

View File

@@ -110,7 +110,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]<BR>"},
"<A href='?src=[REF(src)];power=1'>[on ? "On" : "Off"]</A>" ) "<A href='?src=[REF(src)];power=1'>[on ? "On" : "Off"]</A>" )
if(!locked || issilicon(user)|| IsAdminGhost(user)) if(!locked || hasSiliconAccessInArea(user,get_area(src))|| IsAdminGhost(user))
if(!lasercolor) if(!lasercolor)
dat += text({"<BR> dat += text({"<BR>
Arrest Unidentifiable Persons: []<BR> Arrest Unidentifiable Persons: []<BR>

View File

@@ -111,7 +111,7 @@
dat += "Maintenance panel panel is [open ? "opened" : "closed"]<BR>" dat += "Maintenance panel panel is [open ? "opened" : "closed"]<BR>"
dat += "Behaviour controls are [locked ? "locked" : "unlocked"]<BR>" dat += "Behaviour controls are [locked ? "locked" : "unlocked"]<BR>"
if(!locked || issilicon(user) || IsAdminGhost(user)) if(!locked || hasSiliconAccessInArea(user,get_area(src)) || IsAdminGhost(user))
dat += "Extinguish Fires: <A href='?src=[REF(src)];operation=extinguish_fires'>[extinguish_fires ? "Yes" : "No"]</A><BR>" dat += "Extinguish Fires: <A href='?src=[REF(src)];operation=extinguish_fires'>[extinguish_fires ? "Yes" : "No"]</A><BR>"
dat += "Extinguish People: <A href='?src=[REF(src)];operation=extinguish_people'>[extinguish_people ? "Yes" : "No"]</A><BR>" dat += "Extinguish People: <A href='?src=[REF(src)];operation=extinguish_people'>[extinguish_people ? "Yes" : "No"]</A><BR>"
dat += "Patrol Station: <A href='?src=[REF(src)];operation=patrol'>[auto_patrol ? "Yes" : "No"]</A><BR>" dat += "Patrol Station: <A href='?src=[REF(src)];operation=patrol'>[auto_patrol ? "Yes" : "No"]</A><BR>"

View File

@@ -83,7 +83,7 @@
dat += "None Loaded<BR>" dat += "None Loaded<BR>"
dat += "Behaviour controls are [locked ? "locked" : "unlocked"]<BR>" dat += "Behaviour controls are [locked ? "locked" : "unlocked"]<BR>"
if(!locked || issilicon(user) || IsAdminGhost(user)) if(!locked || hasSiliconAccessInArea(user,get_area(src)) || IsAdminGhost(user))
dat += "Add tiles to new hull plating: <A href='?src=[REF(src)];operation=autotile'>[autotile ? "Yes" : "No"]</A><BR>" dat += "Add tiles to new hull plating: <A href='?src=[REF(src)];operation=autotile'>[autotile ? "Yes" : "No"]</A><BR>"
dat += "Place floor tiles: <A href='?src=[REF(src)];operation=place'>[placetiles ? "Yes" : "No"]</A><BR>" dat += "Place floor tiles: <A href='?src=[REF(src)];operation=place'>[placetiles ? "Yes" : "No"]</A><BR>"
dat += "Replace existing floor tiles with custom tiles: <A href='?src=[REF(src)];operation=replace'>[replacetiles ? "Yes" : "No"]</A><BR>" dat += "Replace existing floor tiles with custom tiles: <A href='?src=[REF(src)];operation=replace'>[replacetiles ? "Yes" : "No"]</A><BR>"

View File

@@ -90,7 +90,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
"<A href='?src=[REF(src)];power=[TRUE]'>[on ? "On" : "Off"]</A>" ) "<A href='?src=[REF(src)];power=[TRUE]'>[on ? "On" : "Off"]</A>" )
if(!locked || issilicon(user) || IsAdminGhost(user)) if(!locked || hasSiliconAccessInArea(user,get_area(src)) || IsAdminGhost(user))
dat += text({"<BR> Auto Patrol: []"}, dat += text({"<BR> Auto Patrol: []"},
"<A href='?src=[REF(src)];operation=patrol'>[auto_patrol ? "On" : "Off"]</A>" ) "<A href='?src=[REF(src)];operation=patrol'>[auto_patrol ? "On" : "Off"]</A>" )

View File

@@ -148,7 +148,7 @@
else else
dat += "None Loaded" dat += "None Loaded"
dat += "<br>Behaviour controls are [locked ? "locked" : "unlocked"]<hr>" dat += "<br>Behaviour controls are [locked ? "locked" : "unlocked"]<hr>"
if(!locked || issilicon(user) || IsAdminGhost(user)) if(!locked || hasSiliconAccessInArea(user,get_area(src)) || IsAdminGhost(user))
dat += "<TT>Healing Threshold: " dat += "<TT>Healing Threshold: "
dat += "<a href='?src=[REF(src)];adj_threshold=-10'>--</a> " dat += "<a href='?src=[REF(src)];adj_threshold=-10'>--</a> "
dat += "<a href='?src=[REF(src)];adj_threshold=-5'>-</a> " dat += "<a href='?src=[REF(src)];adj_threshold=-5'>-</a> "

View File

@@ -262,7 +262,7 @@
// TODO: remove this; PDAs currently depend on it // TODO: remove this; PDAs currently depend on it
/mob/living/simple_animal/bot/mulebot/get_controls(mob/user) /mob/living/simple_animal/bot/mulebot/get_controls(mob/user)
var/ai = issilicon(user) var/ai = hasSiliconAccessInArea(user,get_area(src))
var/dat var/dat
dat += "<h3>Multiple Utility Load Effector Mk. V</h3>" dat += "<h3>Multiple Utility Load Effector Mk. V</h3>"
dat += "<b>ID:</b> [id]<BR>" dat += "<b>ID:</b> [id]<BR>"

View File

@@ -110,7 +110,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
"<A href='?src=[REF(src)];power=1'>[on ? "On" : "Off"]</A>" ) "<A href='?src=[REF(src)];power=1'>[on ? "On" : "Off"]</A>" )
if(!locked || issilicon(user) || IsAdminGhost(user)) if(!locked || hasSiliconAccessInArea(user,get_area(src)) || IsAdminGhost(user))
dat += text({"<BR> dat += text({"<BR>
Arrest Unidentifiable Persons: []<BR> Arrest Unidentifiable Persons: []<BR>
Arrest for Unauthorized Weapons: []<BR> Arrest for Unauthorized Weapons: []<BR>
@@ -131,7 +131,7 @@ Auto Patrol: []"},
/mob/living/simple_animal/bot/secbot/Topic(href, href_list) /mob/living/simple_animal/bot/secbot/Topic(href, href_list)
if(..()) if(..())
return 1 return 1
if(!issilicon(usr) && !IsAdminGhost(usr) && !(bot_core.allowed(usr) || !locked)) if(!hasSiliconAccessInArea(usr,get_area(src)) && !IsAdminGhost(usr) && !(bot_core.allowed(usr) || !locked))
return TRUE return TRUE
switch(href_list["operation"]) switch(href_list["operation"])
if("idcheck") if("idcheck")

View File

@@ -812,7 +812,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
//Can the mob interact() with an atom? //Can the mob interact() with an atom?
/mob/proc/can_interact_with(atom/A) /mob/proc/can_interact_with(atom/A)
return IsAdminGhost(src) || Adjacent(A) return IsAdminGhost(src) || Adjacent(A) || hasSiliconAccessInArea(src,get_area(A))
//Can the mob use Topic to interact with machines //Can the mob use Topic to interact with machines
/mob/proc/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) /mob/proc/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)

View File

@@ -120,3 +120,5 @@
var/registered_z var/registered_z
var/mob/audiovisual_redirect //Mob to redirect messages, speech, and sounds to var/mob/audiovisual_redirect //Mob to redirect messages, speech, and sounds to
var/siliconaccessareas = list()
var/siliconaccesstoggle = FALSE

View File

@@ -409,6 +409,23 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
return return
return TRUE return TRUE
/proc/hasSiliconAccessInArea(mob/user,area/area)
return user && (issilicon(user) || (user.siliconaccesstoggle && area && (area in user.siliconaccessareas)))
/mob/proc/toggleSiliconAccessArea(area/area)
if (area in siliconaccessareas)
siliconaccessareas -= area
to_chat(src,"<span class='warning'>You lost control of [area]!</span>")
return FALSE
else
if (LAZYLEN(siliconaccessareas) < HIJACK_APC_MAX_AMOUNT)
siliconaccessareas += area
to_chat(src,"<span class='notice'>You successfully took control of [area].</span>")
else
to_chat(src,"<span class='warning'>You are connected to too many APCs! Too many more will fry your brain.</span>")
return FALSE
return TRUE
/proc/offer_control(mob/M) /proc/offer_control(mob/M)
to_chat(M, "Control of your mob has been offered to dead players.") to_chat(M, "Control of your mob has been offered to dead players.")
if(usr) if(usr)

View File

@@ -14,7 +14,7 @@
return 0 return 0
// Robots don't really need to see the screen, their wireless connection works as long as computer is on. // Robots don't really need to see the screen, their wireless connection works as long as computer is on.
if(!screen_on && !issilicon(user)) if(!screen_on && !hasSiliconAccessInArea(user,get_area(src)))
if(ui) if(ui)
ui.close() ui.close()
return 0 return 0

View File

@@ -87,7 +87,7 @@
if(IsAdminGhost(user)) if(IsAdminGhost(user))
return 1 return 1
if(issilicon(user)) if(hasSiliconAccessInArea(user,get_area(computer)))
return 1 return 1
if(ishuman(user)) if(ishuman(user))

View File

@@ -35,9 +35,9 @@
return ..() return ..()
/obj/machinery/oui_canview(mob/user) /obj/machinery/oui_canview(mob/user)
if(user.has_unlimited_silicon_privilege) if(user.has_unlimited_silicon_privilege || hasSiliconAccessInArea(user,get_area(src)))
return TRUE return TRUE
if(!can_interact()) if(!can_interact(user))
return FALSE return FALSE
if(iscyborg(user)) if(iscyborg(user))
return can_see(user, src, 7) return can_see(user, src, 7)

View File

@@ -103,6 +103,8 @@
var/update_overlay = -1 var/update_overlay = -1
var/icon_update_needed = FALSE var/icon_update_needed = FALSE
var/obj/machinery/computer/apc_control/remote_control = null var/obj/machinery/computer/apc_control/remote_control = null
var/mob/living/carbon/hijacker = 0
var/hijackerlast = FALSE
/obj/machinery/power/apc/unlocked /obj/machinery/power/apc/unlocked
locked = FALSE locked = FALSE
@@ -268,7 +270,7 @@
. += "<span class='notice'>Alt-Click the APC to [ locked ? "unlock" : "lock"] the interface.</span>" . += "<span class='notice'>Alt-Click the APC to [ locked ? "unlock" : "lock"] the interface.</span>"
if(issilicon(user)) if(hasSiliconAccessInArea(user,area))
. += "<span class='notice'>Ctrl-Click the APC to switch the breaker [ operating ? "off" : "on"].</span>" . += "<span class='notice'>Ctrl-Click the APC to switch the breaker [ operating ? "off" : "on"].</span>"
// update the APC icon to show the three base states // update the APC icon to show the three base states
@@ -312,7 +314,7 @@
SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
if(!(stat & (BROKEN|MAINT)) && update_state & UPSTATE_ALLGOOD) if(!(stat & (BROKEN|MAINT)) && update_state & UPSTATE_ALLGOOD)
SSvis_overlays.add_vis_overlay(src, icon, "apcox-[locked]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) SSvis_overlays.add_vis_overlay(src, icon, "apcox-[locked]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir)
SSvis_overlays.add_vis_overlay(src, icon, "apco3-[charging]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) SSvis_overlays.add_vis_overlay(src, icon, "apco3-[hijacker ? "3" : charging]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir)
if(operating) if(operating)
SSvis_overlays.add_vis_overlay(src, icon, "apco0-[equipment]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) SSvis_overlays.add_vis_overlay(src, icon, "apco0-[equipment]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir)
SSvis_overlays.add_vis_overlay(src, icon, "apco1-[lighting]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) SSvis_overlays.add_vis_overlay(src, icon, "apco1-[lighting]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir)
@@ -327,6 +329,8 @@
light_color = LIGHT_COLOR_BLUE light_color = LIGHT_COLOR_BLUE
if(APC_FULLY_CHARGED) if(APC_FULLY_CHARGED)
light_color = LIGHT_COLOR_GREEN light_color = LIGHT_COLOR_GREEN
if (hijacker)
light_color = LIGHT_COLOR_YELLOW
set_light(lon_range) set_light(lon_range)
else if(update_state & UPSTATE_BLUESCREEN) else if(update_state & UPSTATE_BLUESCREEN)
light_color = LIGHT_COLOR_BLUE light_color = LIGHT_COLOR_BLUE
@@ -395,14 +399,15 @@
else if(environ==2) else if(environ==2)
update_overlay |= APC_UPOVERLAY_ENVIRON2 update_overlay |= APC_UPOVERLAY_ENVIRON2
var/results = 0 var/results = 0
if(last_update_state == update_state && last_update_overlay == update_overlay) if(last_update_state == update_state && last_update_overlay == update_overlay && (hijacker == 0 ? 0 : 1) == hijackerlast)
return 0 return 0
if(last_update_state != update_state) if(last_update_state != update_state)
results += 1 results += 1
if(last_update_overlay != update_overlay) if(last_update_overlay != update_overlay || (hijacker == 0 ? 0 : 1) != hijackerlast)
results += 2 results += 2
if (hijacker ? TRUE : FALSE != hijackerlast)
hijackerlast = hijacker == 0 ? 0 : 1
return results return results
// Used in process so it doesn't update the icon too much // Used in process so it doesn't update the icon too much
@@ -542,7 +547,7 @@
/obj/machinery/power/apc/attackby(obj/item/W, mob/living/user, params) /obj/machinery/power/apc/attackby(obj/item/W, mob/living/user, params)
if(issilicon(user) && get_dist(src,user)>1) if(hasSiliconAccessInArea(user,area) && get_dist(src,user)>1)
return attack_hand(user) return attack_hand(user)
if (istype(W, /obj/item/stock_parts/cell) && opened) if (istype(W, /obj/item/stock_parts/cell) && opened)
@@ -749,7 +754,7 @@
/obj/machinery/power/apc/AltClick(mob/user) /obj/machinery/power/apc/AltClick(mob/user)
. = ..() . = ..()
if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc)) if(!user.canUseTopic(src, !hasSiliconAccessInArea(user,area)) || !isturf(loc))
return return
togglelock(user) togglelock(user)
return TRUE return TRUE
@@ -764,7 +769,7 @@
else if(stat & (BROKEN|MAINT)) else if(stat & (BROKEN|MAINT))
to_chat(user, "<span class='warning'>Nothing happens!</span>") to_chat(user, "<span class='warning'>Nothing happens!</span>")
else else
if(allowed(usr) && !wires.is_cut(WIRE_IDSCAN) && !malfhack) if((allowed(usr) || hasSiliconAccessInArea(usr,area)) && !wires.is_cut(WIRE_IDSCAN) && !malfhack)
locked = !locked locked = !locked
to_chat(user, "<span class='notice'>You [ locked ? "lock" : "unlock"] the APC interface.</span>") to_chat(user, "<span class='notice'>You [ locked ? "lock" : "unlock"] the APC interface.</span>")
update_icon() update_icon()
@@ -841,6 +846,11 @@
if((stat & MAINT) && !opened) //no board; no interface if((stat & MAINT) && !opened) //no board; no interface
return return
/obj/machinery/power/apc/oui_canview(mob/user)
if(user.has_unlimited_silicon_privilege || hasSiliconAccessInArea(user,area))
return TRUE
return ..()
/obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ /obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
@@ -851,7 +861,7 @@
/obj/machinery/power/apc/ui_data(mob/user) /obj/machinery/power/apc/ui_data(mob/user)
var/list/data = list( var/list/data = list(
"locked" = locked && !(integration_cog && is_servant_of_ratvar(user)), "locked" = locked && !(integration_cog && is_servant_of_ratvar(user)) && !hasSiliconAccessInArea(user,area),
"failTime" = failure_timer, "failTime" = failure_timer,
"isOperating" = operating, "isOperating" = operating,
"externalPower" = main_status, "externalPower" = main_status,
@@ -860,11 +870,14 @@
"chargingStatus" = charging, "chargingStatus" = charging,
"totalLoad" = DisplayPower(lastused_total), "totalLoad" = DisplayPower(lastused_total),
"coverLocked" = coverlocked, "coverLocked" = coverlocked,
"siliconUser" = user.has_unlimited_silicon_privilege || user.using_power_flow_console(), "siliconUser" = user.has_unlimited_silicon_privilege || user.using_power_flow_console() || hasSiliconAccessInArea(user,area),
"malfStatus" = get_malf_status(user), "malfStatus" = get_malf_status(user),
"emergencyLights" = !emergency_lights, "emergencyLights" = !emergency_lights,
"nightshiftLights" = nightshift_lights, "nightshiftLights" = nightshift_lights,
"hijackable" = HAS_TRAIT(user,TRAIT_HIJACKER),
"hijacker" = hijacker == user ? TRUE : FALSE,
"drainavail" = cell.percent() > 85,
"lockdownavail" = cell.percent() > 35,
"powerChannels" = list( "powerChannels" = list(
list( list(
"title" = "Equipment", "title" = "Equipment",
@@ -932,17 +945,14 @@
/obj/machinery/power/apc/proc/can_use(mob/user, loud = 0) //used by attack_hand() and Topic() /obj/machinery/power/apc/proc/can_use(mob/user, loud = 0) //used by attack_hand() and Topic()
if(IsAdminGhost(user)) if(IsAdminGhost(user))
return TRUE return TRUE
if (user == hijacker || hasSiliconAccessInArea(user,area))
return TRUE
if (!aidisabled && issilicon(user))
return TRUE
if(user.has_unlimited_silicon_privilege) if(user.has_unlimited_silicon_privilege)
var/mob/living/silicon/ai/AI = user var/mob/living/silicon/ai/AI = user
var/mob/living/silicon/robot/robot = user var/mob/living/silicon/robot/robot = user
if ( \ if (src.aidisabled || malfhack && istype(malfai) && ((istype(AI) && (malfai!=AI && malfai != AI.parent)) || (istype(robot) && (robot in malfai.connected_robots))))
src.aidisabled || \
malfhack && istype(malfai) && \
( \
(istype(AI) && (malfai!=AI && malfai != AI.parent)) || \
(istype(robot) && (robot in malfai.connected_robots)) \
) \
)
if(!loud) if(!loud)
to_chat(user, "<span class='danger'>\The [src] has eee disabled!</span>") to_chat(user, "<span class='danger'>\The [src] has eee disabled!</span>")
return FALSE return FALSE
@@ -952,18 +962,25 @@
. = ..() . = ..()
if (!. && !QDELETED(remote_control)) if (!. && !QDELETED(remote_control))
. = remote_control.can_interact(user) . = remote_control.can_interact(user)
if (hasSiliconAccessInArea(user,area))
return TRUE
/obj/machinery/power/apc/ui_status(mob/user) /obj/machinery/power/apc/ui_status(mob/user)
. = ..() . = ..()
if (!QDELETED(remote_control) && user == remote_control.operator) if (!QDELETED(remote_control) && user == remote_control.operator)
. = UI_INTERACTIVE . = UI_INTERACTIVE
if (hasSiliconAccessInArea(user,area))
. = UI_INTERACTIVE
/obj/machinery/power/apc/ui_act(action, params) /obj/machinery/power/apc/ui_act(action, params)
if(..() || !can_use(usr, 1) || (locked && !usr.has_unlimited_silicon_privilege && !failure_timer && !(integration_cog && (is_servant_of_ratvar(usr))))) if (action == "hijack" && can_use(usr, 1))
hijack(usr)
return
if(..() || !can_use(usr, 1) || (locked && !hasSiliconAccessInArea(usr,area) && !usr.has_unlimited_silicon_privilege && !failure_timer && !(integration_cog && (is_servant_of_ratvar(usr)))))
return return
switch(action) switch(action)
if("lock") if("lock")
if(usr.has_unlimited_silicon_privilege) if(usr.has_unlimited_silicon_privilege || hasSiliconAccessInArea(usr,area))
if((obj_flags & EMAGGED) || (stat & (BROKEN|MAINT))) if((obj_flags & EMAGGED) || (stat & (BROKEN|MAINT)))
to_chat(usr, "The APC does not respond to the command.") to_chat(usr, "The APC does not respond to the command.")
else else
@@ -1000,7 +1017,7 @@
update() update()
. = TRUE . = TRUE
if("overload") if("overload")
if(usr.has_unlimited_silicon_privilege) if(usr.has_unlimited_silicon_privilege || hasSiliconAccessInArea(usr,area))
overload_lighting() overload_lighting()
. = TRUE . = TRUE
if("hack") if("hack")
@@ -1023,6 +1040,21 @@
L.no_emergency = emergency_lights L.no_emergency = emergency_lights
INVOKE_ASYNC(L, /obj/machinery/light/.proc/update, FALSE) INVOKE_ASYNC(L, /obj/machinery/light/.proc/update, FALSE)
CHECK_TICK CHECK_TICK
if("drain")
cell.use(cell.charge)
hijacker.toggleSiliconAccessArea(area)
hijacker = null
set_hijacked_lighting()
update_icon()
energy_fail(30 SECONDS * (cell.charge / cell.maxcharge))
if("lockdown")
var/celluse = rand(20,35)
celluse = celluse /100
for (var/obj/machinery/door/D in GLOB.airlocks)
if (get_area(D) == area)
INVOKE_ASYNC(D,/obj/machinery/door.proc/hostile_lockdown,usr, FALSE)
addtimer(CALLBACK(D,/obj/machinery/door.proc/disable_lockdown, FALSE), 30 SECONDS)
cell.charge -= cell.maxcharge*celluse
return 1 return 1
/obj/machinery/power/apc/proc/toggle_breaker() /obj/machinery/power/apc/proc/toggle_breaker()
@@ -1032,6 +1064,31 @@
update() update()
update_icon() update_icon()
/obj/machinery/power/apc/proc/hijack(mob/living/L)
if (!istype(L))
return
if (hijacker && hijacker != L)
to_chat(L, "<span class='warning'>Someone already has control of this APC. Beginning counter-hijack.</span>")
if (do_after(L,20 SECONDS,target=src))
hijacker.toggleSiliconAccessArea(area)
if (L.toggleSiliconAccessArea(area))
hijacker = L
update_icon()
set_hijacked_lighting()
return
else
to_chat(L, "<span class='warning'>Aborting.</span>")
return
to_chat(L, "<span class='notice'>Beginning hijack of APC.</span>")
if (do_after(L,5 SECONDS,target=src))
if (L.toggleSiliconAccessArea(area))
hijacker = L
update_icon()
set_hijacked_lighting()
else
to_chat(L, "<span class='warning'>Aborting.</span>")
return
/obj/machinery/power/apc/proc/malfhack(mob/living/silicon/ai/malf) /obj/machinery/power/apc/proc/malfhack(mob/living/silicon/ai/malf)
if(!istype(malf)) if(!istype(malf))
return return
@@ -1436,6 +1493,13 @@
L.update(FALSE) L.update(FALSE)
CHECK_TICK CHECK_TICK
/obj/machinery/power/apc/proc/set_hijacked_lighting()
set waitfor = FALSE
for(var/obj/machinery/light/L in area)
L.hijacked = hijacker ? TRUE : FALSE
L.update(FALSE)
CHECK_TICK
#undef UPSTATE_CELL_IN #undef UPSTATE_CELL_IN
#undef UPSTATE_OPENED1 #undef UPSTATE_OPENED1
#undef UPSTATE_OPENED2 #undef UPSTATE_OPENED2

View File

@@ -220,6 +220,7 @@
var/bulb_emergency_colour = "#FF3232" // determines the colour of the light while it's in emergency mode var/bulb_emergency_colour = "#FF3232" // determines the colour of the light while it's in emergency mode
var/bulb_emergency_pow_mul = 0.75 // the multiplier for determining the light's power in emergency mode var/bulb_emergency_pow_mul = 0.75 // the multiplier for determining the light's power in emergency mode
var/bulb_emergency_pow_min = 0.5 // the minimum value for the light's power in emergency mode var/bulb_emergency_pow_min = 0.5 // the minimum value for the light's power in emergency mode
var/hijacked = FALSE // if true, the light is in a hijacked area
/obj/machinery/light/broken /obj/machinery/light/broken
status = LIGHT_BROKEN status = LIGHT_BROKEN
@@ -298,7 +299,10 @@
if(emergency_mode || (A && A.fire)) if(emergency_mode || (A && A.fire))
icon_state = "[base_state]_emergency" icon_state = "[base_state]_emergency"
else else
icon_state = "[base_state]" if (hijacked)
icon_state = "[base_state]_hijacked"
else
icon_state = "[base_state]"
if(on) if(on)
var/mutable_appearance/glowybit = mutable_appearance(overlayicon, base_state, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE) var/mutable_appearance/glowybit = mutable_appearance(overlayicon, base_state, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE)
glowybit.alpha = CLAMP(light_power*250, 30, 200) glowybit.alpha = CLAMP(light_power*250, 30, 200)
@@ -326,6 +330,10 @@
var/area/A = get_area(src) var/area/A = get_area(src)
if (A && A.fire) if (A && A.fire)
CO = bulb_emergency_colour CO = bulb_emergency_colour
else if (hijacked)
BR = BR * 1.5
PO = PO * 1.5
CO = color ? color : LIGHT_COLOR_YELLOW
else if (nightshift_enabled) else if (nightshift_enabled)
BR = nightshift_brightness BR = nightshift_brightness
PO = nightshift_light_power PO = nightshift_light_power
@@ -355,7 +363,7 @@
if(on != on_gs) if(on != on_gs)
on_gs = on on_gs = on
if(on) if(on)
static_power_used = brightness * 20 //20W per unit luminosity static_power_used = brightness * 20 * (hijacked ? 2 : 1) //20W per unit luminosity
addStaticPower(static_power_used, STATIC_LIGHT) addStaticPower(static_power_used, STATIC_LIGHT)
else else
removeStaticPower(static_power_used, STATIC_LIGHT) removeStaticPower(static_power_used, STATIC_LIGHT)

View File

@@ -310,7 +310,7 @@
return return
var/name = stripped_input(usr,"Name","What do you want to name this recipe?", "Recipe", MAX_NAME_LEN) var/name = stripped_input(usr,"Name","What do you want to name this recipe?", "Recipe", MAX_NAME_LEN)
var/recipe = stripped_input(usr,"Recipe","Insert recipe with chem IDs") var/recipe = stripped_input(usr,"Recipe","Insert recipe with chem IDs")
if(!usr.canUseTopic(src, !issilicon(usr))) if(!usr.canUseTopic(src, !hasSiliconAccessInArea(usr,get_area(src))))
return return
if(name && recipe) if(name && recipe)
var/list/first_process = splittext(recipe, ";") var/list/first_process = splittext(recipe, ";")

View File

@@ -261,7 +261,7 @@
return return
vol_each = min(reagents.total_volume / amount, 50) vol_each = min(reagents.total_volume / amount, 50)
var/name = html_decode(stripped_input(usr,"Name:","Name your pill!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN)) var/name = html_decode(stripped_input(usr,"Name:","Name your pill!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN))
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !hasSiliconAccessInArea(usr,get_area(src))))
return return
var/obj/item/reagent_containers/pill/P var/obj/item/reagent_containers/pill/P
var/target_loc = drop_location() var/target_loc = drop_location()
@@ -288,7 +288,7 @@
reagents.trans_to(P,vol_each) reagents.trans_to(P,vol_each)
else else
var/name = html_decode(stripped_input(usr, "Name:", "Name your pack!", reagents.get_master_reagent_name(), MAX_NAME_LEN)) var/name = html_decode(stripped_input(usr, "Name:", "Name your pack!", reagents.get_master_reagent_name(), MAX_NAME_LEN))
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !hasSiliconAccessInArea(usr,get_area(src))))
return return
var/obj/item/reagent_containers/food/condiment/pack/P = new/obj/item/reagent_containers/food/condiment/pack(drop_location()) var/obj/item/reagent_containers/food/condiment/pack/P = new/obj/item/reagent_containers/food/condiment/pack(drop_location())
@@ -314,7 +314,7 @@
return return
vol_each = min(reagents.total_volume / amount, 40) vol_each = min(reagents.total_volume / amount, 40)
var/name = html_decode(stripped_input(usr,"Name:","Name your patch!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN)) var/name = html_decode(stripped_input(usr,"Name:","Name your patch!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN))
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !hasSiliconAccessInArea(usr,get_area(src))))
return return
var/obj/item/reagent_containers/pill/P var/obj/item/reagent_containers/pill/P
@@ -332,7 +332,7 @@
if(condi) if(condi)
var/name = html_decode(stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)) var/name = html_decode(stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN))
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !hasSiliconAccessInArea(usr,get_area(src))))
return return
var/obj/item/reagent_containers/food/condiment/P = new(drop_location()) var/obj/item/reagent_containers/food/condiment/P = new(drop_location())
P.originalname = name P.originalname = name
@@ -345,7 +345,7 @@
amount_full = round(reagents.total_volume / 30) amount_full = round(reagents.total_volume / 30)
vol_part = ((reagents.total_volume*1000) % 30000) / 1000 //% operator doesn't support decimals. vol_part = ((reagents.total_volume*1000) % 30000) / 1000 //% operator doesn't support decimals.
var/name = html_decode(stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)) var/name = html_decode(stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN))
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !hasSiliconAccessInArea(usr,get_area(src))))
return return
var/obj/item/reagent_containers/glass/bottle/P var/obj/item/reagent_containers/glass/bottle/P
@@ -373,7 +373,7 @@
amount_full = round(reagents.total_volume / 60) amount_full = round(reagents.total_volume / 60)
vol_part = reagents.total_volume % 60 vol_part = reagents.total_volume % 60
var/name = html_decode(stripped_input(usr, "Name:","Name your hypovial!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)) var/name = html_decode(stripped_input(usr, "Name:","Name your hypovial!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN))
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !hasSiliconAccessInArea(usr,get_area(src))))
return return
var/obj/item/reagent_containers/glass/bottle/vial/small/P var/obj/item/reagent_containers/glass/bottle/vial/small/P
@@ -408,7 +408,7 @@
vol_each = min(reagents.total_volume / amount, 20) vol_each = min(reagents.total_volume / amount, 20)
var/name = html_decode(stripped_input(usr,"Name:","Name your SmartDart!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN)) var/name = html_decode(stripped_input(usr,"Name:","Name your SmartDart!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN))
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !hasSiliconAccessInArea(usr,get_area(src))))
return return
var/obj/item/reagent_containers/syringe/dart/D var/obj/item/reagent_containers/syringe/dart/D

View File

@@ -142,7 +142,7 @@
/obj/machinery/reagentgrinder/ui_interact(mob/user) // The microwave Menu //I am reasonably certain that this is not a microwave /obj/machinery/reagentgrinder/ui_interact(mob/user) // The microwave Menu //I am reasonably certain that this is not a microwave
. = ..() . = ..()
if(operating || !user.canUseTopic(src, !issilicon(user))) if(operating || !user.canUseTopic(src, !hasSiliconAccessInArea(user,get_area(src))))
return return
var/list/options = list() var/list/options = list()
@@ -170,10 +170,10 @@
for(var/key in options) for(var/key in options)
choice = key choice = key
else else
choice = show_radial_menu(user, src, options, require_near = !issilicon(user)) choice = show_radial_menu(user, src, options, require_near = !hasSiliconAccessInArea(user,get_area(src)))
// post choice verification // post choice verification
if(operating || (isAI(user) && stat & NOPOWER) || !user.canUseTopic(src, !issilicon(user))) if(operating || (isAI(user) && stat & NOPOWER) || !user.canUseTopic(src, !hasSiliconAccessInArea(user,get_area(src))))
return return
switch(choice) switch(choice)
@@ -190,7 +190,7 @@
/obj/machinery/reagentgrinder/examine(mob/user) /obj/machinery/reagentgrinder/examine(mob/user)
. = ..() . = ..()
if(!in_range(user, src) && !issilicon(user) && !isobserver(user)) if(!in_range(user, src) && !hasSiliconAccessInArea(user,get_area(src)) && !isobserver(user))
. += "<span class='warning'>You're too far away to examine [src]'s contents and display!</span>" . += "<span class='warning'>You're too far away to examine [src]'s contents and display!</span>"
return return

View File

@@ -14,6 +14,8 @@ GLOBAL_DATUM_INIT(default_state, /datum/ui_state/default, new)
/mob/living/default_can_use_topic(src_object) /mob/living/default_can_use_topic(src_object)
. = shared_ui_interaction(src_object) . = shared_ui_interaction(src_object)
if (hasSiliconAccessInArea(src,get_area(src_object)))
return UI_INTERACTIVE
if(. > UI_CLOSE && loc) if(. > UI_CLOSE && loc)
. = min(., loc.contents_ui_distance(src_object, src)) // Check the distance... . = min(., loc.contents_ui_distance(src_object, src)) // Check the distance...
if(. == UI_INTERACTIVE) // Non-human living mobs can only look, not touch. if(. == UI_INTERACTIVE) // Non-human living mobs can only look, not touch.
@@ -21,6 +23,8 @@ GLOBAL_DATUM_INIT(default_state, /datum/ui_state/default, new)
/mob/living/carbon/human/default_can_use_topic(src_object) /mob/living/carbon/human/default_can_use_topic(src_object)
. = shared_ui_interaction(src_object) . = shared_ui_interaction(src_object)
if (hasSiliconAccessInArea(src,get_area(src_object)))
return UI_INTERACTIVE
if(. > UI_CLOSE) if(. > UI_CLOSE)
. = min(., shared_living_ui_distance(src_object)) // Check the distance... . = min(., shared_living_ui_distance(src_object)) // Check the distance...

View File

@@ -29,6 +29,22 @@
item = /obj/item/storage/box/syndie_kit/imp_freedom item = /obj/item/storage/box/syndie_kit/imp_freedom
cost = 5 cost = 5
/datum/uplink_item/implants/hijack
name = "Hijack Implant"
desc = "An implant that will let you hack into the APCs on station, allowing you to control them at will and the machinery within those rooms."
item = /obj/item/implanter/hijack
cost = 14 //really overkill, 14 tc, can still get caught in a room you haven't hijacked and you're fucked.
surplus = 0 //nope not having hijack implants with surplus crates nope nope nope nope
restricted = TRUE
/datum/uplink_item/implants/radio
name = "Internal Syndicate Radio Implant"
desc = "An implant injected into the body, allowing the use of an internal Syndicate radio. \
Used just like a regular headset, but can be disabled to use external headsets normally and to avoid detection."
item = /obj/item/storage/box/syndie_kit/imp_radio
cost = 4
restricted = TRUE
/datum/uplink_item/implants/microbomb /datum/uplink_item/implants/microbomb
name = "Microbomb Implant" name = "Microbomb Implant"
desc = "An implant injected into the body, and later activated either manually or automatically upon death. \ desc = "An implant injected into the body, and later activated either manually or automatically upon death. \
@@ -47,14 +63,6 @@
include_modes = list(/datum/game_mode/nuclear) include_modes = list(/datum/game_mode/nuclear)
restricted = TRUE restricted = TRUE
/datum/uplink_item/implants/radio
name = "Internal Syndicate Radio Implant"
desc = "An implant injected into the body, allowing the use of an internal Syndicate radio. \
Used just like a regular headset, but can be disabled to use external headsets normally and to avoid detection."
item = /obj/item/storage/box/syndie_kit/imp_radio
cost = 4
restricted = TRUE
/datum/uplink_item/implants/reviver /datum/uplink_item/implants/reviver
name = "Reviver Implant" name = "Reviver Implant"
desc = "This implant will attempt to revive and heal you if you lose consciousness. Comes with an autosurgeon." desc = "This implant will attempt to revive and heal you if you lose consciousness. Comes with an autosurgeon."

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -961,6 +961,7 @@
#include "code\game\objects\items\implants\implant_exile.dm" #include "code\game\objects\items\implants\implant_exile.dm"
#include "code\game\objects\items\implants\implant_explosive.dm" #include "code\game\objects\items\implants\implant_explosive.dm"
#include "code\game\objects\items\implants\implant_freedom.dm" #include "code\game\objects\items\implants\implant_freedom.dm"
#include "code\game\objects\items\implants\implant_hijack.dm"
#include "code\game\objects\items\implants\implant_krav_maga.dm" #include "code\game\objects\items\implants\implant_krav_maga.dm"
#include "code\game\objects\items\implants\implant_mindshield.dm" #include "code\game\objects\items\implants\implant_mindshield.dm"
#include "code\game\objects\items\implants\implant_misc.dm" #include "code\game\objects\items\implants\implant_misc.dm"

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -148,4 +148,18 @@
{{/if}} {{/if}}
</ui-section> </ui-section>
</ui-notice> </ui-notice>
{{#if data.hijackable}}
<ui-display title='Hijacking'>
{{#if !data.hijacker}}
<ui-button icon='unlock' action='hijack'>Hijack APC</ui-button>
{{else}}
{{#if data.drainavail}}
<ui-button icon='lightbulb-o' action='drain'>Drain APC</ui-button>
{{/if}}
{{#if data.lockdownavail}}
<ui-button icon='lock' action='lockdown'>Lockdown Room</ui-button>
{{/if}}
{{/if}}
</ui-display>
{{/if}}
{{/if}} {{/if}}