///////////////////////////////////////////// //Guest pass //////////////////////////////// ///////////////////////////////////////////// /obj/item/card/id/guest name = "guest pass" desc = "Allows temporary access to station areas." icon_state = "guest" var/temp_access = list() //to prevent agent cards stealing access as permanent var/expiration_time = 0 var/reason = "NOT SPECIFIED" /obj/item/card/id/guest/attach_guest_pass(/obj/item/card/id/guest/G, mob/user) return /obj/item/card/id/guest/GetAccess() if(world.time > expiration_time) return access else return temp_access /obj/item/card/id/guest/examine(mob/user) . = ..() if(world.time < expiration_time) . += SPAN_NOTICE("This pass expires at [station_time_timestamp("hh:mm:ss", expiration_time)].") else . += SPAN_WARNING("It expired at [station_time_timestamp("hh:mm:ss", expiration_time)].") . += SPAN_NOTICE("It grants access to following areas:") for(var/A in temp_access) . += SPAN_NOTICE("[get_access_desc(A)].") . += SPAN_NOTICE("Issuing reason: [reason].") ///////////////////////////////////////////// //Guest pass terminal//////////////////////// ///////////////////////////////////////////// /obj/machinery/computer/guestpass name = "guest pass terminal" desc = "This console allows staff to give out temporary access to their coworkers." icon_state = "guest" icon_screen = "pass" icon_keyboard = null density = FALSE var/obj/item/card/id/scan var/list/accesses = list() var/giv_name = "NOT SPECIFIED" var/reason = "NOT SPECIFIED" var/duration = 5 var/print_cooldown = 0 var/static/global_terminal_id = 0 var/my_terminal_id var/list/internal_log = list() var/mode = FALSE // FALSE - making pass, TRUE - viewing logs /obj/machinery/computer/guestpass/Initialize(mapload) . = ..() my_terminal_id = ++global_terminal_id /obj/machinery/computer/guestpass/item_interaction(mob/living/user, obj/item/used, list/modifiers) if(istype(used, /obj/item/card/id/nct_data_chip)) to_chat(user, SPAN_WARNING("[used] does not seem compatible with this terminal!")) return ITEM_INTERACT_COMPLETE if(istype(used, /obj/item/card/id)) if(!scan) if(user.drop_item()) used.forceMove(src) scan = used SStgui.update_uis(src) else to_chat(user, SPAN_WARNING("There is already ID card inside.")) return ITEM_INTERACT_COMPLETE return ..() /obj/machinery/computer/guestpass/proc/get_changeable_accesses() return scan.access /obj/machinery/computer/guestpass/attack_ai(mob/user) return attack_hand(user) /obj/machinery/computer/guestpass/attack_hand(mob/user) if(..()) return ui_interact(user) /obj/machinery/computer/guestpass/ui_state(mob/user) return GLOB.default_state /obj/machinery/computer/guestpass/ui_interact(mob/user, datum/tgui/ui = null) ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "GuestPass", name) ui.open() /obj/machinery/computer/guestpass/ui_data(mob/user) var/list/data = list() data["showlogs"] = mode data["scan_name"] = scan ? scan.name : FALSE data["issue_log"] = internal_log ? internal_log : list() data["giv_name"] = giv_name data["reason"] = reason data["duration"] = duration if(scan && !(ACCESS_CHANGE_IDS in scan.access)) data["grantableList"] = scan ? scan.access : list() data["canprint"] = FALSE if(!scan) data["printmsg"] = "No card inserted." else if(!length(scan.access)) data["printmsg"] = "Card has no access." else if(!length(accesses)) data["printmsg"] = "No access types selected." else if(print_cooldown > world.time) data["printmsg"] = "Busy for [(round((print_cooldown - world.time) / 10))]s.." else data["printmsg"] = "Print Pass" data["canprint"] = TRUE data["selectedAccess"] = accesses ? accesses : list() return data /obj/machinery/computer/guestpass/ui_static_data(mob/user) var/list/data = list() data["regions"] = get_accesslist_static_data(REGION_GENERAL, REGION_COMMAND) return data /obj/machinery/computer/guestpass/ui_act(action, params, datum/tgui/ui) if(..()) return . = TRUE switch(action) if("scan") // insert/remove your ID card if(scan) if(ishuman(usr)) scan.forceMove(get_turf(usr)) usr.put_in_hands(scan) scan = null else scan.forceMove(get_turf(src)) scan = null accesses.Cut() else var/obj/item/I = usr.get_active_hand() if(istype(I, /obj/item/card/id)) if(usr.drop_item()) I.forceMove(src) scan = I if("mode") mode = !mode if(!scan || !scan.access) return // everything below here requires card auth switch(action) if("giv_name") var/nam = strip_html_simple(input("Person pass is issued to", "Name", giv_name) as text | null) if(nam) giv_name = nam if("reason") var/reas = strip_html_simple(input("Reason why pass is issued", "Reason", reason) as text | null) if(reas) reason = reas if("duration") var/dur = input("Duration (in minutes) during which pass is valid (up to 30 minutes).", "Duration") as num | null if(dur) if(dur > 0 && dur <= 30) duration = dur else to_chat(usr, SPAN_WARNING("Invalid duration.")) if("print") var/dat = "