mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-19 11:05:03 +01:00
[TGUI] Airlock Electronics (#14971)
* Airlock Electronics V1 * Airlock Electronics V1.1 * Airlock Electronics V1.2 * AA tweak thing
This commit is contained in:
@@ -1392,9 +1392,9 @@ About the new airlock wires panel:
|
||||
ae = new/obj/item/airlock_electronics(loc)
|
||||
check_access()
|
||||
if(req_access.len)
|
||||
ae.conf_access = req_access
|
||||
ae.selected_accesses = req_access
|
||||
else if(req_one_access.len)
|
||||
ae.conf_access = req_one_access
|
||||
ae.selected_accesses = req_one_access
|
||||
ae.one_access = 1
|
||||
else
|
||||
ae = electronics
|
||||
|
||||
@@ -3,16 +3,29 @@
|
||||
icon = 'icons/obj/doors/door_assembly.dmi'
|
||||
icon_state = "door_electronics"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
materials = list(MAT_METAL=50, MAT_GLASS=50)
|
||||
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
|
||||
origin_tech = "engineering=2;programming=1"
|
||||
req_access = list(ACCESS_ENGINE)
|
||||
toolspeed = 1
|
||||
usesound = 'sound/items/deconstruct.ogg'
|
||||
var/list/conf_access = null
|
||||
var/one_access = 0 //if set to 1, door would receive req_one_access instead of req_access
|
||||
var/const/max_brain_damage = 60 // Maximum brain damage a mob can have until it can't use the electronics
|
||||
var/unres_sides = 0
|
||||
var/unres_direction = null
|
||||
/// List of accesses currently set
|
||||
var/list/selected_accesses = list()
|
||||
/// Is the door access using req_one_access (TRUE) or req_access (FALSE)
|
||||
var/one_access = FALSE
|
||||
/// An associative list containing all station accesses. Includes their name and access number.
|
||||
var/static/list/door_accesses_list = list()
|
||||
/// Maximum brain damage a mob can have until it can't use the electronics
|
||||
var/const/max_brain_damage = 60
|
||||
/// Which direction has unrestricted access to the airlock (e.g. medbay doors from the inside)
|
||||
var/unres_access_from = null
|
||||
|
||||
/obj/item/airlock_electronics/Initialize(mapload)
|
||||
. = ..()
|
||||
if(!length(door_accesses_list))
|
||||
for(var/access in get_all_accesses())
|
||||
door_accesses_list += list(list(
|
||||
"name" = get_access_desc(access),
|
||||
"id" = access))
|
||||
|
||||
/obj/item/airlock_electronics/attack_self(mob/user)
|
||||
if(!ishuman(user) && !isrobot(user))
|
||||
@@ -21,82 +34,71 @@
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.getBrainLoss() >= max_brain_damage)
|
||||
to_chat(user, "<span class='warning'>You forget how to use \the [src].</span>")
|
||||
to_chat(user, "<span class='warning'>You forget how to use [src].</span>")
|
||||
return
|
||||
tgui_interact(user)
|
||||
|
||||
var/t1 = text("<B>Access control</B><br>\n")
|
||||
t1 += "<hr>"
|
||||
t1 += "<B> Unrestricted Access Settings</B><br>"
|
||||
|
||||
var/list/Directions = list("North","South",,"East",,,,"West")
|
||||
for(var/direction in GLOB.cardinal)
|
||||
if (unres_direction && unres_direction == direction)
|
||||
t1 += "<a style='color: red' href='?src=[UID()];unres_direction=[direction]'>[Directions[direction]]</a><br>"
|
||||
else
|
||||
t1 += "<a href='?src=[UID()];unres_direction=[direction]'>[Directions[direction]]</a><br>"
|
||||
// tgui\packages\tgui\interfaces\AirlockElectronics.js
|
||||
/obj/item/airlock_electronics/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_inventory_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "AirlockElectronics", name, 450, 575, master_ui, state)
|
||||
ui.open()
|
||||
|
||||
t1 += "<hr>"
|
||||
t1 += "Access requirement is set to "
|
||||
t1 += one_access ? "<a style='color: green' href='?src=[UID()];one_access=1'>ONE</a><hr>" : "<a style='color: red' href='?src=[UID()];one_access=1'>ALL</a><hr>"
|
||||
/obj/item/airlock_electronics/tgui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["selected_accesses"] = selected_accesses
|
||||
data["one_access"] = one_access
|
||||
data["unrestricted_dir"] = dir2text(unres_access_from)
|
||||
return data
|
||||
|
||||
t1 += conf_access == null ? "<font color=red>All</font><br>" : "<a href='?src=[UID()];access=all'>All</a><br>"
|
||||
/obj/item/airlock_electronics/tgui_static_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["regions"] = get_accesslist_static_data(REGION_GENERAL, REGION_COMMAND)
|
||||
data["door_access_list"] = door_accesses_list
|
||||
return data
|
||||
|
||||
var/list/accesses = get_all_accesses()
|
||||
for(var/acc in accesses)
|
||||
var/aname = get_access_desc(acc)
|
||||
|
||||
if(!conf_access || !conf_access.len || !(acc in conf_access))
|
||||
t1 += "<a href='?src=[UID()];access=[acc]'>[aname]</a><br>"
|
||||
else if(one_access)
|
||||
t1 += "<a style='color: green' href='?src=[UID()];access=[acc]'>[aname]</a><br>"
|
||||
else
|
||||
t1 += "<a style='color: red' href='?src=[UID()];access=[acc]'>[aname]</a><br>"
|
||||
|
||||
t1 += "<p><a href='?src=[UID()];close=1'>Close</a></p>\n"
|
||||
|
||||
var/datum/browser/popup = new(user, "airlock_electronics", name, 400, 400)
|
||||
popup.set_content(t1)
|
||||
popup.open(0)
|
||||
onclose(user, "airlock")
|
||||
|
||||
/obj/item/airlock_electronics/Topic(href, href_list)
|
||||
..()
|
||||
|
||||
if(usr.incapacitated() || (!ishuman(usr) && !isrobot(usr)))
|
||||
return 1
|
||||
|
||||
if(href_list["close"])
|
||||
usr << browse(null, "window=airlock_electronics")
|
||||
/obj/item/airlock_electronics/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
|
||||
if(..())
|
||||
return
|
||||
|
||||
if(href_list["one_access"])
|
||||
one_access = !one_access
|
||||
. = TRUE
|
||||
// Mostly taken from the RCD code
|
||||
switch(action)
|
||||
if("unrestricted_access")
|
||||
var/direction = text2dir(params["unres_dir"])
|
||||
if(direction == unres_access_from)
|
||||
unres_access_from = null // Deselecting
|
||||
return
|
||||
unres_access_from = direction
|
||||
|
||||
if(href_list["access"])
|
||||
toggle_access(href_list["access"])
|
||||
if("set_one_access")
|
||||
one_access = params["access"] == "one" ? TRUE : FALSE
|
||||
|
||||
if(href_list["unres_direction"])
|
||||
unres_direction = text2num(href_list["unres_direction"])
|
||||
if (unres_sides == unres_direction)
|
||||
unres_sides = 0
|
||||
unres_direction = null
|
||||
else
|
||||
unres_sides = unres_direction
|
||||
if("set")
|
||||
var/access = text2num(params["access"])
|
||||
if(isnull(access))
|
||||
return FALSE
|
||||
if(access in selected_accesses)
|
||||
selected_accesses -= access
|
||||
else
|
||||
selected_accesses |= access
|
||||
|
||||
attack_self(usr)
|
||||
if("grant_region")
|
||||
var/region = text2num(params["region"])
|
||||
if(isnull(region) || region < REGION_GENERAL || region > REGION_COMMAND)
|
||||
return FALSE
|
||||
selected_accesses |= get_region_accesses(region)
|
||||
|
||||
/obj/item/airlock_electronics/proc/toggle_access(access)
|
||||
if(access == "all")
|
||||
conf_access = null
|
||||
else
|
||||
var/req = text2num(access)
|
||||
if("deny_region")
|
||||
var/region = text2num(params["region"])
|
||||
if(isnull(region) || region < REGION_GENERAL || region > REGION_COMMAND)
|
||||
return FALSE
|
||||
selected_accesses -= get_region_accesses(region)
|
||||
|
||||
if(conf_access == null)
|
||||
conf_access = list()
|
||||
if("grant_all")
|
||||
selected_accesses = get_all_accesses()
|
||||
|
||||
if(!(req in conf_access))
|
||||
conf_access += req
|
||||
else
|
||||
conf_access -= req
|
||||
if(!conf_access.len)
|
||||
conf_access = null
|
||||
if("clear_all")
|
||||
selected_accesses = list()
|
||||
|
||||
@@ -296,9 +296,9 @@
|
||||
if(!req_access)
|
||||
check_access()
|
||||
if(req_access.len)
|
||||
ae.conf_access = req_access
|
||||
ae.selected_accesses = req_access
|
||||
else if(req_one_access.len)
|
||||
ae.conf_access = req_one_access
|
||||
ae.selected_accesses = req_one_access
|
||||
ae.one_access = 1
|
||||
else
|
||||
ae = electronics
|
||||
|
||||
@@ -201,9 +201,9 @@
|
||||
electronics.forceMove(display)
|
||||
display.electronics = electronics
|
||||
if(electronics.one_access)
|
||||
display.req_one_access = electronics.conf_access
|
||||
display.req_one_access = electronics.selected_accesses
|
||||
else
|
||||
display.req_access = electronics.conf_access
|
||||
display.req_access = electronics.selected_accesses
|
||||
qdel(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -175,13 +175,13 @@
|
||||
door = new airlock_type(loc)
|
||||
door.setDir(dir)
|
||||
door.electronics = electronics
|
||||
door.unres_sides = electronics.unres_sides
|
||||
door.unres_sides = electronics.unres_access_from
|
||||
door.heat_proof = heat_proof_finished
|
||||
if(electronics.one_access)
|
||||
door.req_access = null
|
||||
door.req_one_access = electronics.conf_access
|
||||
door.req_one_access = electronics.selected_accesses
|
||||
else
|
||||
door.req_access = electronics.conf_access
|
||||
door.req_access = electronics.selected_accesses
|
||||
if(created_name)
|
||||
door.name = created_name
|
||||
else
|
||||
|
||||
@@ -203,9 +203,9 @@
|
||||
windoor.density = FALSE
|
||||
|
||||
if(electronics.one_access)
|
||||
windoor.req_one_access = electronics.conf_access
|
||||
windoor.req_one_access = electronics.selected_accesses
|
||||
else
|
||||
windoor.req_access = electronics.conf_access
|
||||
windoor.req_access = electronics.selected_accesses
|
||||
windoor.electronics = src.electronics
|
||||
electronics.forceMove(windoor)
|
||||
electronics = null
|
||||
|
||||
@@ -0,0 +1,127 @@
|
||||
// code\game\machinery\doors\airlock_electronics.dm
|
||||
import { useBackend } from '../backend';
|
||||
import { Button, Divider, Flex, Grid, Section } from '../components';
|
||||
import { Window } from '../layouts';
|
||||
import { AccessList } from './common/AccessList';
|
||||
import { Fragment } from 'inferno';
|
||||
|
||||
export const AirlockElectronics = (props, context) => {
|
||||
return (
|
||||
<Window resizable>
|
||||
<UnrestrictedAccess />
|
||||
<Divider />
|
||||
<ChooseAccess />
|
||||
</Window>
|
||||
);
|
||||
};
|
||||
|
||||
const UnrestrictedAccess = (props, context) => {
|
||||
const { act, data } = useBackend(context);
|
||||
const {
|
||||
unrestricted_dir,
|
||||
} = data;
|
||||
return (
|
||||
<Section title="Access Control">
|
||||
<Flex direction="column">
|
||||
<Flex.Item bold mb={1}>
|
||||
Unrestricted Access From:
|
||||
</Flex.Item>
|
||||
<Grid>
|
||||
<Grid.Column>
|
||||
<Button
|
||||
fluid
|
||||
textAlign="center"
|
||||
icon="arrow-down"
|
||||
content="North"
|
||||
selected={unrestricted_dir === "north" ? "selected" : null}
|
||||
onClick={() => act('unrestricted_access', {
|
||||
unres_dir: "North",
|
||||
})}
|
||||
/>
|
||||
</Grid.Column>
|
||||
<Grid.Column>
|
||||
<Button
|
||||
fluid
|
||||
textAlign="center"
|
||||
icon="arrow-up"
|
||||
content="South"
|
||||
selected={unrestricted_dir === "south" ? "selected" : null}
|
||||
onClick={() => act('unrestricted_access', {
|
||||
unres_dir: "South",
|
||||
})}
|
||||
/>
|
||||
</Grid.Column>
|
||||
<Grid.Column>
|
||||
<Button
|
||||
fluid
|
||||
textAlign="center"
|
||||
icon="arrow-left"
|
||||
content="East"
|
||||
selected={unrestricted_dir === "east" ? "selected" : null}
|
||||
onClick={() => act('unrestricted_access', {
|
||||
unres_dir: "East",
|
||||
})}
|
||||
/>
|
||||
</Grid.Column>
|
||||
<Grid.Column>
|
||||
<Button
|
||||
fluid
|
||||
textAlign="center"
|
||||
icon="arrow-right"
|
||||
content="West"
|
||||
selected={unrestricted_dir === "west" ? "selected" : null}
|
||||
onClick={() => act('unrestricted_access', {
|
||||
unres_dir: "West",
|
||||
})}
|
||||
/>
|
||||
</Grid.Column>
|
||||
</Grid>
|
||||
</Flex>
|
||||
</Section>
|
||||
);
|
||||
};
|
||||
|
||||
const ChooseAccess = (props, context) => {
|
||||
const { act, data }= useBackend(context);
|
||||
const {
|
||||
selected_accesses,
|
||||
one_access,
|
||||
regions,
|
||||
} = data;
|
||||
return (
|
||||
<AccessList
|
||||
usedByRcd={1}
|
||||
rcdButtons={
|
||||
<Fragment>
|
||||
<Button.Checkbox
|
||||
checked={one_access}
|
||||
content="One"
|
||||
onClick={() => act('set_one_access', {
|
||||
access: 'one',
|
||||
})}
|
||||
/>
|
||||
<Button.Checkbox
|
||||
checked={!one_access}
|
||||
content="All"
|
||||
onClick={() => act('set_one_access', {
|
||||
access: 'all',
|
||||
})}
|
||||
/>
|
||||
</Fragment>
|
||||
}
|
||||
accesses={regions}
|
||||
selectedList={selected_accesses}
|
||||
accessMod={ref => act('set', {
|
||||
access: ref,
|
||||
})}
|
||||
grantAll={() => act('grant_all')}
|
||||
denyAll={() => act('clear_all')}
|
||||
grantDep={ref => act('grant_region', {
|
||||
region: ref,
|
||||
})}
|
||||
denyDep={ref => act('deny_region', {
|
||||
region: ref,
|
||||
})}
|
||||
/>
|
||||
);
|
||||
};
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user