mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-26 10:03:45 +00:00
They act like IDs, but have limited duration (up to 30 minutes). When time is up, all access is erased from them. Adds guest pass terminal, which issues these. Anyone can issue them, but only to areas their ID has access to. All issued passes are logged in terminals.
181 lines
5.3 KiB
Plaintext
181 lines
5.3 KiB
Plaintext
/obj/item/weapon/card/id/guest
|
|
name = "guest pass"
|
|
desc = "Allows temporary access to station areas."
|
|
icon_state = "guest"
|
|
|
|
var/expiration_time = 0
|
|
var/reason = "NOT SPECIFIED"
|
|
|
|
/obj/item/weapon/card/id/guest/New()
|
|
processing_objects.Add(src)
|
|
|
|
/obj/item/weapon/card/id/guest/Del()
|
|
processing_objects.Remove(src)
|
|
..()
|
|
|
|
/obj/item/weapon/card/id/guest/process()
|
|
if (world.time > expiration_time)
|
|
access = null
|
|
icon_state = "guest_invalid"
|
|
processing_objects.Remove(src)
|
|
|
|
/obj/item/weapon/card/id/guest/examine()
|
|
..()
|
|
if (world.time < expiration_time)
|
|
usr << "\blue This pass expires at [worldtime2text(expiration_time)]."
|
|
else
|
|
usr << "\red It expired at [worldtime2text(expiration_time)]."
|
|
|
|
/obj/item/weapon/card/id/guest/read()
|
|
if (world.time > expiration_time)
|
|
usr << "This pass expired at [worldtime2text(expiration_time)]."
|
|
else
|
|
usr << "This pass expires at [worldtime2text(expiration_time)]."
|
|
usr << "It grants access to following areas:"
|
|
for (var/A in access)
|
|
usr << "[get_access_desc(A)]."
|
|
usr << "Issuing reason: [reason]."
|
|
return
|
|
|
|
|
|
/obj/machinery/computer/guestpass
|
|
name = "guest pass terminal"
|
|
icon_state = "guest"
|
|
density = 0
|
|
|
|
|
|
var/obj/item/weapon/card/id/giver
|
|
var/list/accesses = list()
|
|
var/giv_name = "NOT SPECIFIED"
|
|
var/reason = "NOT SPECIFIED"
|
|
var/duration = 0
|
|
|
|
var/list/internal_log = list()
|
|
var/mode = 0 // 0 - making pass, 1 - viewing logs
|
|
|
|
/obj/machinery/computer/guestpass/attackby(obj/O, mob/user)
|
|
if(istype(O, /obj/item/weapon/card/id))
|
|
user.drop_item()
|
|
O.loc = src
|
|
giver = O
|
|
updateUsrDialog()
|
|
|
|
/obj/machinery/computer/guestpass/attack_ai(var/mob/user as mob)
|
|
return attack_hand(user)
|
|
|
|
/obj/machinery/computer/guestpass/attack_paw(var/mob/user as mob)
|
|
return attack_hand(user)
|
|
|
|
/obj/machinery/computer/guestpass/attack_hand(var/mob/user as mob)
|
|
if(..())
|
|
return
|
|
|
|
user.set_machine(src)
|
|
var/dat
|
|
|
|
if (mode == 1) //Logs
|
|
dat += "<h3>Activity log</h3><br>"
|
|
for (var/entry in internal_log)
|
|
dat += "[entry]<br><hr>"
|
|
dat += "<a href='?src=\ref[src];action=print'>Print</a><br>"
|
|
dat += "<a href='?src=\ref[src];mode=0'>Back</a><br>"
|
|
else
|
|
dat += "<h3>Guest pass terminal #[uid]</h3><br>"
|
|
dat += "<a href='?src=\ref[src];mode=1'>View activity log</a><br><br>"
|
|
dat += "Issuing ID: <a href='?src=\ref[src];action=id'>[giver]</a><br>"
|
|
dat += "Issued to: <a href='?src=\ref[src];choice=giv_name'>[giv_name]</a><br>"
|
|
dat += "Reason: <a href='?src=\ref[src];choice=reason'>[reason]</a><br>"
|
|
dat += "Duration (minutes): <a href='?src=\ref[src];choice=duration'>[duration] m</a><br>"
|
|
dat += "Access to areas:<br>"
|
|
if (giver && giver.access)
|
|
for (var/A in giver.access)
|
|
var/area = get_access_desc(A)
|
|
if (A in accesses)
|
|
area = "<b>[area]</b>"
|
|
dat += "<a href='?src=\ref[src];choice=access;access=[A]'>[area]</a><br>"
|
|
dat += "<br><a href='?src=\ref[src];action=issue'>Issue pass</a><br>"
|
|
|
|
user << browse(dat, "window=guestpass;size=400x520")
|
|
onclose(user, "guestpass")
|
|
|
|
|
|
/obj/machinery/computer/guestpass/Topic(href, href_list)
|
|
if(..())
|
|
return
|
|
usr.set_machine(src)
|
|
if (href_list["mode"])
|
|
mode = text2num(href_list["mode"])
|
|
|
|
if (href_list["choice"])
|
|
switch(href_list["choice"])
|
|
if ("giv_name")
|
|
var/nam = input("Person pass is issued to", "Name", name)
|
|
if (nam)
|
|
giv_name = nam
|
|
if ("reason")
|
|
var/reas = input("Reason why pass is issued", "Reason", reason)
|
|
reason = reas
|
|
if ("duration")
|
|
var/dur = input("Duration (in minutes) during which pass is valid.", "Duration") as num
|
|
if (dur > 0 && dur < 30)
|
|
duration = dur
|
|
else
|
|
usr << "\red Invalid duration."
|
|
if ("access")
|
|
var/A = text2num(href_list["access"])
|
|
if (A in accesses)
|
|
accesses.Remove(A)
|
|
else
|
|
accesses.Add(A)
|
|
if (href_list["action"])
|
|
switch(href_list["action"])
|
|
if ("id")
|
|
if (giver)
|
|
if(ishuman(usr))
|
|
giver.loc = usr.loc
|
|
if(!usr.get_active_hand())
|
|
usr.put_in_hands(giver)
|
|
giver = null
|
|
else
|
|
giver.loc = src.loc
|
|
giver = null
|
|
else
|
|
var/obj/item/I = usr.get_active_hand()
|
|
if (istype(I, /obj/item/weapon/card/id))
|
|
usr.drop_item()
|
|
I.loc = src
|
|
giver = I
|
|
updateUsrDialog()
|
|
|
|
if ("print")
|
|
var/dat = "<h3>Activity log of guest pass terminal #[uid]</h3><br>"
|
|
for (var/entry in internal_log)
|
|
dat += "[entry]<br><hr>"
|
|
//usr << "Printing the log, standby..."
|
|
//sleep(50)
|
|
var/obj/item/weapon/paper/P = new/obj/item/weapon/paper( loc )
|
|
P.name = "activity log"
|
|
P.info = dat
|
|
|
|
if ("issue")
|
|
if (giver)
|
|
var/number = add_zero("[rand(0,9999)]", 4)
|
|
var/entry = "\[[worldtime2text()]\] Pass #[number] issued by [giver.registered_name] ([giver.assignment]) to [giv_name]. Reason: [reason]. Grants access to following areas: "
|
|
for (var/i=1 to accesses.len)
|
|
var/A = accesses[i]
|
|
if (A)
|
|
var/area = get_access_desc(A)
|
|
entry += "[i > 1 ? ", [area]" : "[area]"]"
|
|
entry += ". Expires at [worldtime2text(world.time + duration*10*60)]."
|
|
internal_log.Add(entry)
|
|
|
|
var/obj/item/weapon/card/id/guest/pass = new(src.loc)
|
|
pass.access = accesses.Copy()
|
|
pass.registered_name = giv_name
|
|
pass.expiration_time = world.time + duration*10*60
|
|
pass.reason = reason
|
|
pass.name = "guest pass #[number]"
|
|
else
|
|
usr << "\red Cannot issue pass without issuing ID."
|
|
updateUsrDialog()
|
|
return |