mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-25 04:57:12 +01:00
Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into DreamFluff
This commit is contained in:
@@ -108,6 +108,8 @@ var/list/admin_verbs_event = list(
|
||||
/client/proc/toggle_random_events,
|
||||
/client/proc/toggle_ert_calling,
|
||||
/client/proc/cmd_admin_change_custom_event,
|
||||
/client/proc/cmd_admin_custom_event_info,
|
||||
/client/proc/cmd_view_custom_event_info,
|
||||
/datum/admins/proc/access_news_network, /*allows access of newscasters*/
|
||||
/client/proc/cmd_admin_direct_narrate, /*send text directly to a player with no padding. Useful for narratives and fluff-text*/
|
||||
/client/proc/cmd_admin_world_narrate, /*sends text to all players with no padding*/
|
||||
@@ -347,10 +349,12 @@ var/list/admin_verbs_snpc = list(
|
||||
if(mob.invisibility == INVISIBILITY_OBSERVER)
|
||||
mob.invisibility = initial(mob.invisibility)
|
||||
to_chat(mob, "<span class='danger'>Invisimin off. Invisibility reset.</span>")
|
||||
mob.add_to_all_human_data_huds()
|
||||
//TODO: Make some kind of indication for the badmin that they are currently invisible
|
||||
else
|
||||
mob.invisibility = INVISIBILITY_OBSERVER
|
||||
to_chat(mob, "<span class='notice'>Invisimin on. You are now as invisible as a ghost.</span>")
|
||||
mob.remove_from_all_data_huds()
|
||||
|
||||
/client/proc/player_panel()
|
||||
set name = "Player Panel"
|
||||
|
||||
@@ -100,3 +100,9 @@ you will have to do something like if(client.holder.rights & R_ADMIN) yourself.
|
||||
return 0
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/admins/vv_edit_var(var_name, var_value)
|
||||
return FALSE // no admin abuse
|
||||
|
||||
/datum/admins/can_vv_delete()
|
||||
return FALSE // don't break shit either
|
||||
@@ -89,8 +89,12 @@
|
||||
|
||||
if("delete")
|
||||
for(var/d in objs)
|
||||
if(!datum_is_forbidden(d))
|
||||
qdel(d)
|
||||
if(istype(d, /datum))
|
||||
var/datum/D = d
|
||||
if(!D.can_vv_delete())
|
||||
to_chat(usr, "[D] rejected your deletion")
|
||||
continue
|
||||
qdel(d)
|
||||
|
||||
if("select")
|
||||
var/text = ""
|
||||
@@ -118,9 +122,6 @@
|
||||
if("set" in query_tree)
|
||||
var/list/set_list = query_tree["set"]
|
||||
for(var/d in objs)
|
||||
// Forbid explicitly modifying an admin datum's vars
|
||||
if(datum_is_forbidden(d))
|
||||
return
|
||||
for(var/list/sets in set_list)
|
||||
var/datum/temp = d
|
||||
var/i = 0
|
||||
@@ -128,11 +129,10 @@
|
||||
if(++i == sets.len)
|
||||
if(istype(temp, /turf) && (v == "x" || v == "y" || v == "z"))
|
||||
continue
|
||||
if(!datum_is_forbidden(temp.vars[v]))
|
||||
return
|
||||
temp.vars[v] = SDQL_expression(d, set_list[sets])
|
||||
if(!temp.vv_edit_var(v, SDQL_expression(d, set_list[sets])))
|
||||
to_chat(usr, "[temp] rejected your varedit.")
|
||||
break
|
||||
if(temp.vars.Find(v) && (istype(temp.vars[v], /datum) || istype(temp.vars[v], /client)) && !datum_is_forbidden(temp.vars[v]))
|
||||
if(temp.vars.Find(v) && (istype(temp.vars[v], /datum) || istype(temp.vars[v], /client)))
|
||||
temp = temp.vars[v]
|
||||
else
|
||||
break
|
||||
@@ -440,11 +440,6 @@
|
||||
for(var/arg in arguments)
|
||||
new_args[++new_args.len] = SDQL_expression(source, arg)
|
||||
|
||||
for(var/p in forbidden_varedit_object_types)
|
||||
if(istype(object, p))
|
||||
to_chat(usr, "<span class='warning'>It is forbidden to run this object's procs.</span>")
|
||||
return
|
||||
|
||||
if(object == world) // Global proc.
|
||||
procname = "/proc/[procname]"
|
||||
return call(procname)(arglist(new_args))
|
||||
|
||||
@@ -38,3 +38,49 @@
|
||||
to_chat(src, "<h2 class='alert'>A custom event is taking place. OOC Info:</h2>")
|
||||
to_chat(src, "<span class='alert'>[html_encode(custom_event_msg)]</span>")
|
||||
to_chat(src, "<br>")
|
||||
|
||||
//admin event info to be view by admins
|
||||
|
||||
/client/proc/cmd_admin_custom_event_info()
|
||||
set category = "Event"
|
||||
set name = "Change Custom Admin Event Info"
|
||||
|
||||
if(!check_rights(R_EVENT))
|
||||
to_chat(src, "Only administrators may use this command.")
|
||||
return
|
||||
|
||||
var/input = input(usr, "Enter the description of the custom event. This is informations for admins only. Use it to notify other admins of event info but not players.", "Custom Event Info", custom_event_msg) as message|null
|
||||
if(!input || input == "")
|
||||
custom_event_admin_msg = null
|
||||
log_admin("[key_name(usr)] has cleared the custom admin event info text.")
|
||||
message_admins("[key_name_admin(usr)] has cleared the custom admin event text.")
|
||||
return
|
||||
|
||||
log_admin("[key_name(usr)] has changed the custom admin event info text.")
|
||||
message_admins("[key_name_admin(usr)] has changed the custom admin event info text.")
|
||||
|
||||
custom_event_admin_msg = input
|
||||
|
||||
for(var/client/X in admins)
|
||||
if(check_rights(R_EVENT,0,X.mob))
|
||||
to_chat(X, "<h1 class='alert'>Custom Admin Event Info</h1>")
|
||||
to_chat(X, "<h2 class='alert'>A custom event is starting. OOC Admin Info:</h2>")
|
||||
to_chat(X, "<span class='alert'>[html_encode(custom_event_admin_msg)]</span>")
|
||||
to_chat(X,"<br>")
|
||||
|
||||
/client/proc/cmd_view_custom_event_info()
|
||||
set category = "Event"
|
||||
set name = "Custom Event Admin Info"
|
||||
|
||||
if(!check_rights(R_EVENT))
|
||||
to_chat(src, "Only administrators may use this command.")
|
||||
return
|
||||
|
||||
if(!custom_event_admin_msg || custom_event_admin_msg == "")
|
||||
to_chat(src, "There currently is no known custom admin event taking place.")
|
||||
return
|
||||
|
||||
to_chat(src, "<h1 class='alert'>Custom Event Info</h1>")
|
||||
to_chat(src, "<h2 class='alert'>A custom event is taking place. OOC Info:</h2>")
|
||||
to_chat(src, "<span class='alert'>[html_encode(custom_event_admin_msg)]</span>")
|
||||
to_chat(src, "<br>")
|
||||
|
||||
@@ -22,360 +22,251 @@
|
||||
src.massmodify_variables(A, var_name, method)
|
||||
feedback_add_details("admin_verb","MEV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
|
||||
/client/proc/massmodify_variables(var/atom/O, var/var_name = "", var/method = 0)
|
||||
if(!check_rights(R_VAREDIT)) return
|
||||
|
||||
var/list/locked = list("vars", "key", "ckey", "client")
|
||||
|
||||
for(var/p in forbidden_varedit_object_types)
|
||||
if( istype(O,p) )
|
||||
to_chat(usr, "<span class='danger'>It is forbidden to edit this object's variables.</span>")
|
||||
return
|
||||
|
||||
var/list/names = list()
|
||||
for(var/V in O.vars)
|
||||
names += V
|
||||
|
||||
names = sortList(names)
|
||||
/client/proc/massmodify_variables(datum/O, var_name = "", method = 0)
|
||||
if(!check_rights(R_VAREDIT))
|
||||
return
|
||||
if(!istype(O))
|
||||
return
|
||||
|
||||
var/variable = ""
|
||||
|
||||
if(!var_name)
|
||||
variable = input("Which var?","Var") as null|anything in names
|
||||
var/list/names = list()
|
||||
for(var/V in O.vars)
|
||||
names += V
|
||||
|
||||
names = sortList(names)
|
||||
|
||||
variable = input("Which var?", "Var") as null|anything in names
|
||||
else
|
||||
variable = var_name
|
||||
|
||||
if(!variable) return
|
||||
if(!variable || !O.can_vv_get(variable))
|
||||
return
|
||||
var/default
|
||||
var/var_value = O.vars[variable]
|
||||
var/dir
|
||||
|
||||
if(variable == "holder" || (variable in locked))
|
||||
if(!check_rights(R_DEBUG)) return
|
||||
if(variable in VVckey_edit)
|
||||
to_chat(src, "It's forbidden to mass-modify ckeys. It'll crash everyone's client you dummy.")
|
||||
return
|
||||
if(variable in VVlocked)
|
||||
if(!check_rights(R_DEBUG))
|
||||
return
|
||||
if(variable in VVicon_edit_lock)
|
||||
if(!check_rights(R_EVENT | R_DEBUG))
|
||||
return
|
||||
if(variable in VVpixelmovement)
|
||||
if(!check_rights(R_DEBUG))
|
||||
return
|
||||
var/prompt = alert(src, "Editing this var may irreparably break tile gliding for the rest of the round. THIS CAN'T BE UNDONE", "DANGER", "ABORT ", "Continue", " ABORT")
|
||||
if(prompt != "Continue")
|
||||
return
|
||||
|
||||
if(isnull(var_value))
|
||||
to_chat(usr, "Unable to determine variable type.")
|
||||
|
||||
else if(isnum(var_value))
|
||||
to_chat(usr, "Variable appears to be <b>NUM</b>.")
|
||||
default = "num"
|
||||
dir = 1
|
||||
|
||||
else if(istext(var_value))
|
||||
to_chat(usr, "Variable appears to be <b>TEXT</b>.")
|
||||
default = "text"
|
||||
|
||||
else if(isloc(var_value))
|
||||
to_chat(usr, "Variable appears to be <b>REFERENCE</b>.")
|
||||
default = "reference"
|
||||
|
||||
else if(isicon(var_value))
|
||||
to_chat(usr, "Variable appears to be <b>ICON</b>.")
|
||||
var_value = "[bicon(var_value)]"
|
||||
default = "icon"
|
||||
|
||||
else if(istype(var_value,/atom) || istype(var_value,/datum))
|
||||
to_chat(usr, "Variable appears to be <b>TYPE</b>.")
|
||||
default = "type"
|
||||
|
||||
else if(istype(var_value,/list))
|
||||
to_chat(usr, "Variable appears to be <b>LIST</b>.")
|
||||
default = "list"
|
||||
|
||||
else if(istype(var_value,/client))
|
||||
to_chat(usr, "Variable appears to be <b>CLIENT</b>.")
|
||||
default = "cancel"
|
||||
default = vv_get_class(var_value)
|
||||
|
||||
if(isnull(default))
|
||||
to_chat(src, "Unable to determine variable type.")
|
||||
else
|
||||
to_chat(usr, "Variable appears to be <b>FILE</b>.")
|
||||
default = "file"
|
||||
to_chat(src, "Variable appears to be <b>[uppertext(default)]</b>.")
|
||||
|
||||
to_chat(usr, "Variable contains: [var_value]")
|
||||
if(dir)
|
||||
switch(var_value)
|
||||
if(1)
|
||||
dir = "NORTH"
|
||||
if(2)
|
||||
dir = "SOUTH"
|
||||
if(4)
|
||||
dir = "EAST"
|
||||
if(8)
|
||||
dir = "WEST"
|
||||
if(5)
|
||||
dir = "NORTHEAST"
|
||||
if(6)
|
||||
dir = "SOUTHEAST"
|
||||
if(9)
|
||||
dir = "NORTHWEST"
|
||||
if(10)
|
||||
dir = "SOUTHWEST"
|
||||
else
|
||||
dir = null
|
||||
if(dir)
|
||||
to_chat(usr, "If a direction, direction is: [dir]")
|
||||
to_chat(src, "Variable contains: [var_value]")
|
||||
|
||||
var/class = input("What kind of variable?","Variable Type",default) as null|anything in list("text",
|
||||
"num","type","icon","file","edit referenced object","restore to default")
|
||||
if(default == VV_NUM)
|
||||
var/dir_text = ""
|
||||
if(dir < 0 && dir < 16)
|
||||
if(dir & 1)
|
||||
dir_text += "NORTH"
|
||||
if(dir & 2)
|
||||
dir_text += "SOUTH"
|
||||
if(dir & 4)
|
||||
dir_text += "EAST"
|
||||
if(dir & 8)
|
||||
dir_text += "WEST"
|
||||
|
||||
if(!class)
|
||||
if(dir_text)
|
||||
to_chat(src, "If a direction, direction is: [dir_text]")
|
||||
|
||||
var/value = vv_get_value(default_class = default)
|
||||
var/new_value = value["value"]
|
||||
var/class = value["class"]
|
||||
|
||||
if(!class || !new_value == null && class != VV_NULL)
|
||||
return
|
||||
|
||||
var/original_name
|
||||
if(class == VV_MESSAGE)
|
||||
class = VV_TEXT
|
||||
|
||||
if(!istype(O, /atom))
|
||||
original_name = "\ref[O] ([O])"
|
||||
else
|
||||
original_name = O:name
|
||||
if(value["type"])
|
||||
class = VV_NEW_TYPE
|
||||
|
||||
var/original_name = "[O]"
|
||||
|
||||
var/rejected = 0
|
||||
var/accepted = 0
|
||||
|
||||
switch(class)
|
||||
if(VV_RESTORE_DEFAULT)
|
||||
to_chat(src, "Finding items...")
|
||||
var/list/items = get_all_of_type(O.type, method)
|
||||
to_chat(src, "Changing [items.len] items...")
|
||||
for(var/thing in items)
|
||||
if(!thing)
|
||||
continue
|
||||
var/datum/D = thing
|
||||
if(D.vv_edit_var(variable, initial(D.vars[variable])) != FALSE)
|
||||
accepted++
|
||||
else
|
||||
rejected++
|
||||
CHECK_TICK
|
||||
|
||||
if("restore to default")
|
||||
O.vars[variable] = initial(O.vars[variable])
|
||||
if(method)
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if( istype(M , O.type) )
|
||||
M.vars[variable] = O.vars[variable]
|
||||
M.on_varedit(variable)
|
||||
if(VV_TEXT)
|
||||
var/list/varsvars = vv_parse_text(O, new_value)
|
||||
var/pre_processing = new_value
|
||||
var/unique
|
||||
if(varsvars && varsvars.len)
|
||||
unique = alert(usr, "Process vars unique to each instance, or same for all?", "Variable Association", "Unique", "Same")
|
||||
if(unique == "Unique")
|
||||
unique = TRUE
|
||||
else
|
||||
unique = FALSE
|
||||
for(var/V in varsvars)
|
||||
new_value = replacetext(new_value,"\[[V]]","[O.vars[V]]")
|
||||
|
||||
else if(istype(O, /obj))
|
||||
for(var/obj/A in world)
|
||||
if( istype(A , O.type) )
|
||||
A.vars[variable] = O.vars[variable]
|
||||
A.on_varedit(variable)
|
||||
to_chat(src, "Finding items...")
|
||||
var/list/items = get_all_of_type(O.type, method)
|
||||
to_chat(src, "Changing [items.len] items...")
|
||||
for(var/thing in items)
|
||||
if(!thing)
|
||||
continue
|
||||
var/datum/D = thing
|
||||
if(unique)
|
||||
new_value = pre_processing
|
||||
for(var/V in varsvars)
|
||||
new_value = replacetext(new_value,"\[[V]]","[D.vars[V]]")
|
||||
|
||||
else if(istype(O, /turf))
|
||||
for(var/turf/A in world)
|
||||
if( istype(A , O.type) )
|
||||
A.vars[variable] = O.vars[variable]
|
||||
A.on_varedit(variable)
|
||||
if(D.vv_edit_var(variable, new_value) != FALSE)
|
||||
accepted++
|
||||
else
|
||||
rejected++
|
||||
CHECK_TICK
|
||||
|
||||
if(VV_NEW_TYPE)
|
||||
var/many = alert(src, "Create only one [value["type"]] and assign each or a new one for each thing", "How Many", "One", "Many", "Cancel")
|
||||
if(many == "Cancel")
|
||||
return
|
||||
if(many == "Many")
|
||||
many = TRUE
|
||||
else
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if(M.type == O.type)
|
||||
M.vars[variable] = O.vars[variable]
|
||||
M.on_varedit(variable)
|
||||
many = FALSE
|
||||
|
||||
else if(istype(O, /obj))
|
||||
for(var/obj/A in world)
|
||||
if(A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
A.on_varedit(variable)
|
||||
var/type = value["type"]
|
||||
to_chat(src, "Finding items...")
|
||||
var/list/items = get_all_of_type(O.type, method)
|
||||
to_chat(src, "Changing [items.len] items...")
|
||||
for(var/thing in items)
|
||||
if(!thing)
|
||||
continue
|
||||
var/datum/D = thing
|
||||
if(many && !new_value)
|
||||
new_value = new type()
|
||||
|
||||
else if(istype(O, /turf))
|
||||
for(var/turf/A in world)
|
||||
if(A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
A.on_varedit(variable)
|
||||
if(D.vv_edit_var(variable, new_value) != FALSE)
|
||||
accepted++
|
||||
else
|
||||
rejected++
|
||||
new_value = null
|
||||
CHECK_TICK
|
||||
|
||||
if("edit referenced object")
|
||||
return .(O.vars[variable])
|
||||
else
|
||||
to_chat(src, "Finding items...")
|
||||
var/list/items = get_all_of_type(O.type, method)
|
||||
to_chat(src, "Changing [items.len] items...")
|
||||
for(var/thing in items)
|
||||
if(!thing)
|
||||
continue
|
||||
var/datum/D = thing
|
||||
if(D.vv_edit_var(variable, new_value) != FALSE)
|
||||
accepted++
|
||||
else
|
||||
rejected++
|
||||
CHECK_TICK
|
||||
|
||||
if("text")
|
||||
var/new_value = input("Enter new text:","Text",O.vars[variable]) as message|null
|
||||
if(new_value == null) return
|
||||
O.vars[variable] = new_value
|
||||
|
||||
if(method)
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if( istype(M , O.type) )
|
||||
M.vars[variable] = O.vars[variable]
|
||||
var/count = rejected+accepted
|
||||
if(!count)
|
||||
to_chat(src, "No objects found")
|
||||
return
|
||||
if(!accepted)
|
||||
to_chat(src, "Every object rejected your edit")
|
||||
return
|
||||
if(rejected)
|
||||
to_chat(src, "[rejected] out of [count] objects rejected your edit")
|
||||
|
||||
else if(istype(O, /obj))
|
||||
for(var/obj/A in world)
|
||||
if( istype(A , O.type) )
|
||||
A.vars[variable] = O.vars[variable]
|
||||
log_to_dd("### MassVarEdit by [src]: [O.type] (A/R [accepted]/[rejected]) [variable]=[html_encode("[O.vars[variable]]")]([list2params(value)])")
|
||||
log_admin("[key_name(src)] mass modified [original_name]'s [variable] to [O.vars[variable]] ([accepted] objects modified)")
|
||||
message_admins("[key_name_admin(src)] mass modified [original_name]'s [variable] to [O.vars[variable]] ([accepted] objects modified)")
|
||||
|
||||
else if(istype(O, /turf))
|
||||
for(var/turf/A in world)
|
||||
if( istype(A , O.type) )
|
||||
A.vars[variable] = O.vars[variable]
|
||||
else
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if(M.type == O.type)
|
||||
M.vars[variable] = O.vars[variable]
|
||||
/proc/get_all_of_type(var/T, subtypes = TRUE)
|
||||
var/list/typecache = list()
|
||||
typecache[T] = 1
|
||||
if(subtypes)
|
||||
typecache = typecacheof(typecache)
|
||||
. = list()
|
||||
if(ispath(T, /mob))
|
||||
for(var/mob/thing in mob_list)
|
||||
if(typecache[thing.type])
|
||||
. += thing
|
||||
CHECK_TICK
|
||||
|
||||
else if(istype(O, /obj))
|
||||
for(var/obj/A in world)
|
||||
if(A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
else if(ispath(T, /obj/machinery/door))
|
||||
for(var/obj/machinery/door/thing in airlocks)
|
||||
if(typecache[thing.type])
|
||||
. += thing
|
||||
CHECK_TICK
|
||||
|
||||
else if(istype(O, /turf))
|
||||
for(var/turf/A in world)
|
||||
if(A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
else if(ispath(T, /obj/machinery))
|
||||
for(var/obj/machinery/thing in machines)
|
||||
if(typecache[thing.type])
|
||||
. += thing
|
||||
CHECK_TICK
|
||||
|
||||
if("num")
|
||||
var/new_value = input("Enter new number:","Num",\
|
||||
O.vars[variable]) as num|null
|
||||
if(new_value == null) return
|
||||
else if(ispath(T, /obj))
|
||||
for(var/obj/thing in world)
|
||||
if(typecache[thing.type])
|
||||
. += thing
|
||||
CHECK_TICK
|
||||
|
||||
if(variable=="light_range")
|
||||
O.set_light(new_value)
|
||||
else
|
||||
O.vars[variable] = new_value
|
||||
else if(ispath(T, /atom/movable))
|
||||
for(var/atom/movable/thing in world)
|
||||
if(typecache[thing.type])
|
||||
. += thing
|
||||
CHECK_TICK
|
||||
|
||||
if(method)
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if( istype(M , O.type) )
|
||||
if(variable=="light_range")
|
||||
M.set_light(new_value)
|
||||
else
|
||||
M.vars[variable] = O.vars[variable]
|
||||
else if(ispath(T, /turf))
|
||||
for(var/turf/thing in world)
|
||||
if(typecache[thing.type])
|
||||
. += thing
|
||||
CHECK_TICK
|
||||
|
||||
else if(istype(O, /obj))
|
||||
for(var/obj/A in world)
|
||||
if( istype(A , O.type) )
|
||||
if(variable=="light_range")
|
||||
A.set_light(new_value)
|
||||
else
|
||||
A.vars[variable] = O.vars[variable]
|
||||
else if(ispath(T, /atom))
|
||||
for(var/atom/thing in world)
|
||||
if(typecache[thing.type])
|
||||
. += thing
|
||||
CHECK_TICK
|
||||
|
||||
else if(istype(O, /turf))
|
||||
for(var/turf/A in world)
|
||||
if( istype(A , O.type) )
|
||||
if(variable=="light_range")
|
||||
A.set_light(new_value)
|
||||
else
|
||||
A.vars[variable] = O.vars[variable]
|
||||
else if(ispath(T, /client))
|
||||
for(var/client/thing in clients)
|
||||
if(typecache[thing.type])
|
||||
. += thing
|
||||
CHECK_TICK
|
||||
|
||||
else
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if(M.type == O.type)
|
||||
if(variable=="light_range")
|
||||
M.set_light(new_value)
|
||||
else
|
||||
M.vars[variable] = O.vars[variable]
|
||||
else if(ispath(T, /datum))
|
||||
for(var/datum/thing)
|
||||
if(typecache[thing.type])
|
||||
. += thing
|
||||
CHECK_TICK
|
||||
|
||||
else if(istype(O, /obj))
|
||||
for(var/obj/A in world)
|
||||
if(A.type == O.type)
|
||||
if(variable=="light_range")
|
||||
A.set_light(new_value)
|
||||
else
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O, /turf))
|
||||
for(var/turf/A in world)
|
||||
if(A.type == O.type)
|
||||
if(variable=="light_range")
|
||||
A.set_light(new_value)
|
||||
else
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
if("type")
|
||||
var/new_value
|
||||
new_value = input("Enter type:","Type",O.vars[variable]) as null|anything in typesof(/obj,/mob,/area,/turf)
|
||||
if(new_value == null) return
|
||||
O.vars[variable] = new_value
|
||||
if(method)
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if( istype(M , O.type) )
|
||||
M.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O, /obj))
|
||||
for(var/obj/A in world)
|
||||
if( istype(A , O.type) )
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O, /turf))
|
||||
for(var/turf/A in world)
|
||||
if( istype(A , O.type) )
|
||||
A.vars[variable] = O.vars[variable]
|
||||
else
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if(M.type == O.type)
|
||||
M.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O, /obj))
|
||||
for(var/obj/A in world)
|
||||
if(A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O, /turf))
|
||||
for(var/turf/A in world)
|
||||
if(A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
if("file")
|
||||
var/new_value = input("Pick file:","File",O.vars[variable]) as null|file
|
||||
if(new_value == null) return
|
||||
O.vars[variable] = new_value
|
||||
|
||||
if(method)
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if( istype(M , O.type) )
|
||||
M.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O.type, /obj))
|
||||
for(var/obj/A in world)
|
||||
if( istype(A , O.type) )
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O.type, /turf))
|
||||
for(var/turf/A in world)
|
||||
if( istype(A , O.type) )
|
||||
A.vars[variable] = O.vars[variable]
|
||||
else
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if(M.type == O.type)
|
||||
M.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O.type, /obj))
|
||||
for(var/obj/A in world)
|
||||
if(A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O.type, /turf))
|
||||
for(var/turf/A in world)
|
||||
if(A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
if("icon")
|
||||
var/new_value = input("Pick icon:","Icon",O.vars[variable]) as null|icon
|
||||
if(new_value == null) return
|
||||
O.vars[variable] = new_value
|
||||
if(method)
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if( istype(M , O.type) )
|
||||
M.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O, /obj))
|
||||
for(var/obj/A in world)
|
||||
if( istype(A , O.type) )
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O, /turf))
|
||||
for(var/turf/A in world)
|
||||
if( istype(A , O.type) )
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
else
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if(M.type == O.type)
|
||||
M.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O, /obj))
|
||||
for(var/obj/A in world)
|
||||
if(A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O, /turf))
|
||||
for(var/turf/A in world)
|
||||
if(A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
log_admin("[key_name(src)] mass modified [original_name]'s [variable] to [O.vars[variable]]")
|
||||
message_admins("[key_name_admin(src)] mass modified [original_name]'s [variable] to [O.vars[variable]]", 1)
|
||||
else
|
||||
for(var/datum/thing in world)
|
||||
if(typecache[thing.type])
|
||||
. += thing
|
||||
CHECK_TICK
|
||||
File diff suppressed because it is too large
Load Diff
@@ -61,7 +61,7 @@
|
||||
if(usr)
|
||||
if(usr.client)
|
||||
if(usr.client.holder)
|
||||
to_chat(M, "<b>old You hear a voice in your head... <i>[msg]</i></b>")
|
||||
to_chat(M, "<b>You hear a voice in your head... <i>[msg]</i></b>")
|
||||
|
||||
log_admin("SubtlePM: [key_name(usr)] -> [key_name(M)] : [msg]")
|
||||
message_admins("<span class='boldnotice'>SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]</span>", 1)
|
||||
@@ -588,22 +588,30 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
|
||||
/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in view())
|
||||
/client/proc/cmd_admin_delete(atom/A as obj|mob|turf in view())
|
||||
set category = "Admin"
|
||||
set name = "Delete"
|
||||
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
if(alert(src, "Are you sure you want to delete:\n[O]\nat ([O.x], [O.y], [O.z])?", "Confirmation", "Yes", "No") == "Yes")
|
||||
log_admin("[key_name(usr)] deleted [O] at ([O.x],[O.y],[O.z])")
|
||||
message_admins("[key_name_admin(usr)] deleted [O] at ([O.x],[O.y],[O.z])", 1)
|
||||
admin_delete(A)
|
||||
|
||||
/client/proc/admin_delete(datum/D)
|
||||
if(istype(D) && !D.can_vv_delete())
|
||||
to_chat(src, "[D] rejected your deletion")
|
||||
return
|
||||
var/atom/A = D
|
||||
var/coords = istype(A) ? "at ([A.x], [A.y], [A.z])" : ""
|
||||
if(alert(src, "Are you sure you want to delete:\n[D]\n[coords]?", "Confirmation", "Yes", "No") == "Yes")
|
||||
log_admin("[key_name(usr)] deleted [D][coords]")
|
||||
message_admins("[key_name_admin(usr)] deleted [D][coords]", 1)
|
||||
feedback_add_details("admin_verb","DEL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
if(istype(O, /turf))
|
||||
var/turf/T = O
|
||||
if(isturf(D))
|
||||
var/turf/T = D
|
||||
T.ChangeTurf(/turf/space)
|
||||
return
|
||||
qdel(O)
|
||||
else
|
||||
qdel(D)
|
||||
|
||||
/client/proc/cmd_admin_list_open_jobs()
|
||||
set category = "Admin"
|
||||
|
||||
@@ -436,6 +436,8 @@
|
||||
on_holder_add()
|
||||
add_admin_verbs()
|
||||
admin_memo_output("Show", 0, 1)
|
||||
if(custom_event_admin_msg && custom_event_admin_msg != "" && check_rights(R_EVENT))
|
||||
cmd_view_custom_event_info()
|
||||
|
||||
// Forcibly enable hardware-accelerated graphics, as we need them for the lighting overlays.
|
||||
// (but turn them off first, since sometimes BYOND doesn't turn them on properly otherwise)
|
||||
|
||||
@@ -181,7 +181,7 @@
|
||||
if((!silence_steps || shoe_sound) && TR.use(4))
|
||||
silence_steps = 1
|
||||
shoe_sound = null
|
||||
to_chat(user, "You tape the soles of [src] to silence their footsteps.")
|
||||
to_chat(user, "You tape the soles of [src] to silence your footsteps.")
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -321,7 +321,7 @@
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/syndi/attack_self(mob/user)
|
||||
on = !on
|
||||
if(on)
|
||||
to_chat(user, "<span class='notice'>You switch your helmet to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor.</span>")
|
||||
to_chat(user, "<span class='notice'>You switch your helmet to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed.</span>")
|
||||
name = initial(name)
|
||||
desc = initial(desc)
|
||||
set_light(brightness_on)
|
||||
@@ -365,7 +365,7 @@
|
||||
/obj/item/clothing/suit/space/hardsuit/syndi/attack_self(mob/user)
|
||||
on = !on
|
||||
if(on)
|
||||
to_chat(user, "<span class='notice'>You switch your hardsuit to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor.</span>")
|
||||
to_chat(user, "<span class='notice'>You switch your hardsuit to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed.</span>")
|
||||
name = "blood-red hardsuit"
|
||||
desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders."
|
||||
slowdown = 1
|
||||
|
||||
@@ -308,8 +308,35 @@
|
||||
user.update_inv_wear_suit()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/device/fluff/fei_gasmask_kit //Fei Hazelwood: Tariq Yon-Dale
|
||||
name = "gas mask conversion kit"
|
||||
desc = "A gas mask conversion kit."
|
||||
icon_state = "modkit"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
/obj/item/device/fluff/fei_gasmask_kit/afterattack(atom/target, mob/user, proximity)
|
||||
if(!proximity || !ishuman(user) || user.incapacitated())
|
||||
return
|
||||
|
||||
if(istype(target, /obj/item/clothing/mask/gas) && !istype(target, /obj/item/clothing/mask/gas/welding))
|
||||
to_chat(user, "<span class='notice'>You modify the appearance of [target].</span>")
|
||||
var/obj/item/clothing/mask/gas/M = target
|
||||
M.name = "Prescription Gas Mask"
|
||||
M.desc = "It looks heavily modified, but otherwise functions as a gas mask. The words “Property of Yon-Dale” can be seen on the inner band."
|
||||
M.icon = 'icons/obj/custom_items.dmi'
|
||||
M.icon_state = "gas_tariq"
|
||||
M.species_fit = list("Vulpkanin")
|
||||
M.sprite_sheets = list(
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi'
|
||||
)
|
||||
user.update_icons()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
|
||||
|
||||
/obj/item/device/fluff/desolate_baton_kit //DesolateG: Michael Smith
|
||||
name = "stun baton converstion kit"
|
||||
name = "stun baton conversion kit"
|
||||
desc = "Some sci-fi looking parts for a stun baton."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "scifikit"
|
||||
@@ -742,6 +769,17 @@
|
||||
species_fit = null
|
||||
sprite_sheets = null
|
||||
|
||||
/obj/item/clothing/suit/jacket/fluff/jacksvest // Anxipal: Jack Harper
|
||||
name = "Jack's vest"
|
||||
desc = "A rugged leather vest with a tag labelled \"President\"."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "jacksvest"
|
||||
ignore_suitadjust = TRUE
|
||||
actions_types = list()
|
||||
adjust_flavour = null
|
||||
species_fit = null
|
||||
sprite_sheets = null
|
||||
|
||||
/obj/item/clothing/suit/fluff/kluys // Kluys: Cripty Pandaen
|
||||
name = "Nano Fibre Jacket"
|
||||
desc = "A Black Suit made out of nanofibre. The newest of cyberpunk fashion using hightech liquid to solid materials."
|
||||
@@ -1186,4 +1224,16 @@
|
||||
item_color = "fethasnecklace"
|
||||
slot_flags = SLOT_MASK | SLOT_TIE
|
||||
|
||||
<<<<<<< HEAD
|
||||
|
||||
=======
|
||||
/obj/item/weapon/bedsheet/fluff/hugosheet //HugoLuman: Dan Martinez
|
||||
name = "Cosmic space blankie"
|
||||
desc = "Made from the dreams of space children everywhere."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
lefthand_file = 'icons/mob/inhands/fluff_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/fluff_righthand.dmi'
|
||||
icon_state = "sheetcosmos"
|
||||
item_state = "sheetcosmos"
|
||||
item_color = "sheetcosmos"
|
||||
>>>>>>> 179477ed078256f709c70b05fd03040cb8d46ca3
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
/datum/event/alien_infestation
|
||||
announceWhen = 400
|
||||
var/spawncount = 1
|
||||
var/spawncount = 2
|
||||
var/successSpawn = 0 //So we don't make a command report if nothing gets spawned.
|
||||
|
||||
/datum/event/alien_infestation/setup()
|
||||
announceWhen = rand(announceWhen, announceWhen + 50)
|
||||
if(prob(50))
|
||||
spawncount++
|
||||
|
||||
/datum/event/alien_infestation/announce()
|
||||
if(successSpawn)
|
||||
|
||||
@@ -286,7 +286,7 @@
|
||||
drink_container.desc = "[recipe_to_use.description]"
|
||||
flick("bottler_on", src)
|
||||
spawn(45)
|
||||
QDEL_LIST_ASSOC_VAL(slots)
|
||||
resetSlots()
|
||||
bottling = 0
|
||||
drink_container.forceMove(loc)
|
||||
updateUsrDialog()
|
||||
@@ -405,3 +405,7 @@
|
||||
icon_state = "bottler_on"
|
||||
else
|
||||
icon_state = "bottler_off"
|
||||
|
||||
/obj/machinery/bottler/proc/resetSlots()
|
||||
QDEL_LIST_ASSOC_VAL(slots)
|
||||
slots.len = 3
|
||||
@@ -1,5 +1,3 @@
|
||||
#define SHOT_FLAME_TEMPERATURE 700
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass
|
||||
name = "shot glass"
|
||||
desc = "No glasses were shot in the making of this glass."
|
||||
@@ -79,7 +77,7 @@
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/attackby(obj/item/W)
|
||||
..()
|
||||
if(is_hot(W) >= 600)
|
||||
if(is_hot(W))
|
||||
fire_act()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/attack_hand(mob/user, pickupfireoverride = TRUE)
|
||||
|
||||
@@ -71,8 +71,7 @@
|
||||
|
||||
var/datum/reagent/R = null
|
||||
if(random_reagent)
|
||||
R = pick(subtypesof(/datum/reagent))
|
||||
R = chemical_reagents_list[initial(R.id)]
|
||||
R = get_random_reagent_id()
|
||||
|
||||
queen_bee = new(src)
|
||||
queen_bee.beehome = src
|
||||
@@ -89,13 +88,12 @@
|
||||
B.beehome = src
|
||||
B.assign_reagent(R)
|
||||
|
||||
|
||||
/obj/structure/beebox/premade/random
|
||||
random_reagent = TRUE
|
||||
|
||||
|
||||
/obj/structure/beebox/process()
|
||||
if(queen_bee)
|
||||
if(queen_bee && !queen_bee.beegent.can_synth)
|
||||
if(bee_resources >= BEE_RESOURCE_HONEYCOMB_COST)
|
||||
if(honeycombs.len < get_max_honeycomb())
|
||||
bee_resources = max(bee_resources-BEE_RESOURCE_HONEYCOMB_COST, 0)
|
||||
@@ -172,11 +170,13 @@
|
||||
|
||||
var/obj/item/queen_bee/qb = I
|
||||
user.unEquip(qb)
|
||||
|
||||
qb.queen.forceMove(src)
|
||||
bees += qb.queen
|
||||
queen_bee = qb.queen
|
||||
qb.queen = null
|
||||
if(qb.queen.beegent.can_synth)
|
||||
qb.queen.forceMove(src)
|
||||
bees += qb.queen
|
||||
queen_bee = qb.queen
|
||||
qb.queen = null
|
||||
else
|
||||
visible_message("<span class='notice'>The [qb] refuses to settle down. Maybe it's something to do with its reagent?</span>")
|
||||
|
||||
if(queen_bee)
|
||||
visible_message("<span class='notice'>[user] sets [qb] down inside the apiary, making it their new home.</span>")
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/mob/living/carbon/human/emote(var/act,var/m_type=1,var/message = null,var/force)
|
||||
|
||||
if(stat == DEAD)
|
||||
if((stat == DEAD) || (status_flags & FAKEDEATH))
|
||||
return // No screaming bodies
|
||||
|
||||
var/param = null
|
||||
@@ -76,6 +76,12 @@
|
||||
else //Everyone else fails, skip the emote attempt
|
||||
return
|
||||
|
||||
if("creaks", "creak")
|
||||
if(species.name == "Diona") //Only Dionas can Creaks.
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
|
||||
else //Everyone else fails, skip the emote attempt
|
||||
return
|
||||
|
||||
if("hiss", "hisses")
|
||||
if(species.name == "Unathi") //Only Unathi can hiss.
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
|
||||
@@ -170,6 +176,13 @@
|
||||
playsound(loc, 'sound/effects/Kidanclack2.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound.
|
||||
m_type = 2
|
||||
|
||||
if("creaks", "creak")
|
||||
var/M = handle_emote_param(param)
|
||||
|
||||
message = "<B>[src]</B> creaks[M ? " at [M]" : ""]."
|
||||
playsound(loc, 'sound/voice/dionatalk1.ogg', 50, 0) //Credit https://www.youtube.com/watch?v=ufnvlRjsOTI [0:13 - 0:16]
|
||||
m_type = 2
|
||||
|
||||
if("hiss", "hisses")
|
||||
var/M = handle_emote_param(param)
|
||||
|
||||
@@ -826,6 +839,8 @@
|
||||
emotelist += "\nUnathi specific emotes :- hiss(es)"
|
||||
if("Vulpkanin")
|
||||
emotelist += "\nVulpkanin specific emotes :- growl(s)-none/mob, howl(s)-none/mob"
|
||||
if("Diona")
|
||||
emotelist += "\nDiona specific emotes :- creak(s)"
|
||||
|
||||
if (species.name == "Slime People")
|
||||
emotelist += "\nSlime people specific emotes :- squish(es)-(none)/mob"
|
||||
|
||||
@@ -2033,7 +2033,21 @@
|
||||
|
||||
..()
|
||||
|
||||
mob/living/carbon/human/get_taste_sensitivity()
|
||||
|
||||
/mob/living/carbon/human/vv_get_dropdown()
|
||||
. = ..()
|
||||
. += "---"
|
||||
.["Set Species"] = "?_src_=vars;setspecies=[UID()]"
|
||||
.["Make AI"] = "?_src_=vars;makeai=[UID()]"
|
||||
.["Make Mask of Nar'sie"] = "?_src_=vars;makemask=[UID()]"
|
||||
.["Make cyborg"] = "?_src_=vars;makerobot=[UID()]"
|
||||
.["Make monkey"] = "?_src_=vars;makemonkey=[UID()]"
|
||||
.["Make alien"] = "?_src_=vars;makealien=[UID()]"
|
||||
.["Make slime"] = "?_src_=vars;makeslime=[UID()]"
|
||||
.["Make superhero"] = "?_src_=vars;makesuper=[UID()]"
|
||||
. += "---"
|
||||
|
||||
/mob/living/carbon/human/get_taste_sensitivity()
|
||||
if(species)
|
||||
return species.taste_sensitivity
|
||||
else
|
||||
|
||||
@@ -932,7 +932,7 @@
|
||||
/mob/living/carbon/human/handle_changeling()
|
||||
if(mind)
|
||||
if(mind.changeling)
|
||||
mind.changeling.regenerate()
|
||||
mind.changeling.regenerate(src)
|
||||
if(hud_used)
|
||||
hud_used.lingchemdisplay.invisibility = 0
|
||||
hud_used.lingchemdisplay.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='#dd66dd'>[round(mind.changeling.chem_charges)]</font></div>"
|
||||
|
||||
@@ -771,6 +771,8 @@
|
||||
path = /mob/living/carbon/human/diona
|
||||
default_language = "Galactic Common"
|
||||
language = "Rootspeak"
|
||||
speech_sounds = list('sound/voice/dionatalk1.ogg') //Credit https://www.youtube.com/watch?v=ufnvlRjsOTI [0:13 - 0:16]
|
||||
speech_chance = 20
|
||||
unarmed_type = /datum/unarmed_attack/diona
|
||||
//primitive_form = "Nymph"
|
||||
slowdown = 5
|
||||
|
||||
@@ -12,8 +12,8 @@
|
||||
handle_blood()
|
||||
for(var/obj/item/organ/internal/O in internal_organs)
|
||||
O.on_life()
|
||||
handle_changeling()
|
||||
|
||||
handle_changeling()
|
||||
handle_wetness()
|
||||
|
||||
// Increase germ_level regularly
|
||||
|
||||
@@ -175,6 +175,7 @@
|
||||
return
|
||||
if(target.mind.assigned_role != "Civilian")
|
||||
to_chat(user, "<span class='warning'>You can only recruit Civilians.</span>")
|
||||
return
|
||||
if(recruiting)
|
||||
to_chat(user, "<span class='danger'>You are already recruiting!</span>")
|
||||
charge_counter = charge_max
|
||||
|
||||
@@ -68,6 +68,7 @@ var/list/robot_verbs_default = list(
|
||||
var/lockcharge //Used when locking down a borg to preserve cell charge
|
||||
var/speed = 0 //Cause sec borgs gotta go fast //No they dont!
|
||||
var/scrambledcodes = 0 // Used to determine if a borg shows up on the robotics console. Setting to one hides them.
|
||||
var/pdahide = 0 //Used to hide the borg from the messenger list
|
||||
var/tracking_entities = 0 //The number of known entities currently accessing the internal camera
|
||||
var/braintype = "Cyborg"
|
||||
var/base_icon = ""
|
||||
@@ -193,6 +194,7 @@ var/list/robot_verbs_default = list(
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
/mob/living/silicon/robot/proc/get_default_name(var/prefix as text)
|
||||
if(prefix)
|
||||
modtype = prefix
|
||||
@@ -226,10 +228,12 @@ var/list/robot_verbs_default = list(
|
||||
if(!rbPDA)
|
||||
rbPDA = new(src)
|
||||
rbPDA.set_name_and_job(real_name, braintype)
|
||||
if(scrambledcodes)
|
||||
var/datum/data/pda/app/messenger/M = rbPDA.find_program(/datum/data/pda/app/messenger)
|
||||
if(M)
|
||||
var/datum/data/pda/app/messenger/M = rbPDA.find_program(/datum/data/pda/app/messenger)
|
||||
if(M)
|
||||
if(scrambledcodes)
|
||||
M.hidden = 1
|
||||
if(pdahide)
|
||||
M.toff = 1
|
||||
|
||||
/mob/living/silicon/robot/binarycheck()
|
||||
if(is_component_functioning("comms"))
|
||||
@@ -262,14 +266,18 @@ var/list/robot_verbs_default = list(
|
||||
/mob/living/silicon/robot/proc/pick_module()
|
||||
if(module)
|
||||
return
|
||||
var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service", "Security")
|
||||
var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service")
|
||||
if(!config.forbid_secborg)
|
||||
modules += "Security"
|
||||
if(!config.forbid_peaceborg)
|
||||
modules += "Peacekeeper"
|
||||
if(security_level == (SEC_LEVEL_GAMMA || SEC_LEVEL_EPSILON) || crisis)
|
||||
to_chat(src, "<span class='warning'>Crisis mode active. Combat module available.</span>")
|
||||
modules+="Combat"
|
||||
modules += "Combat"
|
||||
if(ticker && ticker.mode && ticker.mode.name == "nations")
|
||||
var/datum/game_mode/nations/N = ticker.mode
|
||||
if(N.kickoff)
|
||||
modules = list("Peacekeeper")
|
||||
modules = list("Nations")
|
||||
if(mmi != null && mmi.alien)
|
||||
modules = "Hunter"
|
||||
modtype = input("Please, select a module!", "Robot", null, null) as null|anything in modules
|
||||
@@ -336,6 +344,11 @@ var/list/robot_verbs_default = list(
|
||||
module_sprites["Noble-SEC"] = "Noble-SEC"
|
||||
status_flags &= ~CANPUSH
|
||||
|
||||
if("Peacekeeper")
|
||||
module = new /obj/item/weapon/robot_module/peacekeeper(src)
|
||||
module_sprites["Peacekeeper"] = "peace"
|
||||
status_flags &= ~CANPUSH
|
||||
|
||||
if("Engineering")
|
||||
module = new /obj/item/weapon/robot_module/engineering(src)
|
||||
module.channels = list("Engineering" = 1)
|
||||
@@ -362,8 +375,8 @@ var/list/robot_verbs_default = list(
|
||||
module.channels = list("Security" = 1)
|
||||
icon_state = "droidcombat"
|
||||
|
||||
if("Peacekeeper")
|
||||
module = new /obj/item/weapon/robot_module/peacekeeper(src)
|
||||
if("Nations")
|
||||
module = new /obj/item/weapon/robot_module/nations(src)
|
||||
module.channels = list()
|
||||
icon_state = "droidpeace"
|
||||
|
||||
@@ -381,14 +394,14 @@ var/list/robot_verbs_default = list(
|
||||
module.add_subsystems_and_actions(src)
|
||||
|
||||
//Custom_sprite check and entry
|
||||
if(custom_sprite == 1)
|
||||
if(custom_sprite && check_sprite("[ckey]-[modtype]"))
|
||||
module_sprites["Custom"] = "[src.ckey]-[modtype]"
|
||||
|
||||
hands.icon_state = lowertext(module.module_type)
|
||||
feedback_inc("cyborg_[lowertext(modtype)]",1)
|
||||
rename_character(real_name, get_default_name())
|
||||
|
||||
if(modtype == "Medical" || modtype == "Security" || modtype == "Combat" || modtype == "Peacekeeper")
|
||||
if(modtype == "Medical" || modtype == "Security" || modtype == "Combat" || modtype == "Peacekeeper" || modtype == "Nations")
|
||||
status_flags &= ~CANPUSH
|
||||
|
||||
choose_icon(6,module_sprites)
|
||||
@@ -480,7 +493,7 @@ var/list/robot_verbs_default = list(
|
||||
toggle_ionpulse()
|
||||
return
|
||||
|
||||
cell.charge -= 50 // 500 steps on a default cell.
|
||||
cell.charge -= 25 // 500 steps on a default cell.
|
||||
return 1
|
||||
|
||||
/mob/living/silicon/robot/proc/toggle_ionpulse()
|
||||
@@ -958,7 +971,7 @@ var/list/robot_verbs_default = list(
|
||||
else
|
||||
overlays += "[panelprefix]-openpanel -c"
|
||||
|
||||
var/combat = list("Combat","Peacekeeper")
|
||||
var/combat = list("Combat","Nations")
|
||||
if(modtype in combat)
|
||||
if(base_icon == "")
|
||||
base_icon = icon_state
|
||||
@@ -1323,6 +1336,7 @@ var/list/robot_verbs_default = list(
|
||||
icon_state = "nano_bloodhound"
|
||||
lawupdate = 0
|
||||
scrambledcodes = 1
|
||||
pdahide = 1
|
||||
modtype = "Commando"
|
||||
faction = list("nanotrasen")
|
||||
designation = "Nanotrasen Combat"
|
||||
@@ -1371,6 +1385,7 @@ var/list/robot_verbs_default = list(
|
||||
icon_state = "syndie_bloodhound"
|
||||
lawupdate = 0
|
||||
scrambledcodes = 1
|
||||
pdahide = 1
|
||||
faction = list("syndicate")
|
||||
designation = "Syndicate Assault"
|
||||
modtype = "Syndicate"
|
||||
@@ -1437,15 +1452,15 @@ var/list/robot_verbs_default = list(
|
||||
radio.config(module.channels)
|
||||
notify_ai(2)
|
||||
|
||||
/mob/living/silicon/robot/peacekeeper
|
||||
/mob/living/silicon/robot/nations
|
||||
base_icon = "droidpeace"
|
||||
icon_state = "droidpeace"
|
||||
modtype = "Peacekeeper"
|
||||
designation = "Peacekeeper"
|
||||
modtype = "Nations"
|
||||
designation = "Nations"
|
||||
|
||||
/mob/living/silicon/robot/peacekeeper/init()
|
||||
/mob/living/silicon/robot/nations/init()
|
||||
..()
|
||||
module = new /obj/item/weapon/robot_module/peacekeeper(src)
|
||||
module = new /obj/item/weapon/robot_module/nations(src)
|
||||
//languages
|
||||
module.add_languages(src)
|
||||
//subsystems
|
||||
@@ -1474,3 +1489,10 @@ var/list/robot_verbs_default = list(
|
||||
borked_part.wrapped = new borked_part.external_type
|
||||
borked_part.heal_damage(brute,burn)
|
||||
borked_part.install()
|
||||
|
||||
/mob/living/silicon/robot/proc/check_sprite(spritename)
|
||||
. = FALSE
|
||||
|
||||
var/static/all_borg_icon_states = icon_states('icons/mob/custom_synthetic/custom-synthetic.dmi')
|
||||
if(spritename in all_borg_icon_states)
|
||||
. = TRUE
|
||||
|
||||
@@ -189,6 +189,7 @@
|
||||
/obj/item/weapon/robot_module/engineering/New()
|
||||
..()
|
||||
modules += new /obj/item/weapon/rcd/borg(src)
|
||||
modules += new /obj/item/weapon/rpd(src)
|
||||
modules += new /obj/item/weapon/extinguisher(src)
|
||||
modules += new /obj/item/weapon/weldingtool/largetank/cyborg(src)
|
||||
modules += new /obj/item/weapon/screwdriver/cyborg(src)
|
||||
@@ -228,6 +229,22 @@
|
||||
|
||||
fix_modules()
|
||||
|
||||
/obj/item/weapon/robot_module/peacekeeper
|
||||
name = "peacekeeping robot module"
|
||||
module_type = "Standard"
|
||||
|
||||
/obj/item/weapon/robot_module/peacekeeper/New()
|
||||
..()
|
||||
modules += new /obj/item/weapon/cookiesynth(src)
|
||||
modules += new /obj/item/device/harmalarm(src)
|
||||
modules += new /obj/item/weapon/reagent_containers/borghypo/peace(src)
|
||||
modules += new /obj/item/taperoll/police(src)
|
||||
modules += new /obj/item/borg/cyborghug/peacekeeper(src)
|
||||
modules += new /obj/item/weapon/extinguisher(src)
|
||||
emag = new /obj/item/weapon/reagent_containers/borghypo/peace/hacked(src)
|
||||
|
||||
fix_modules()
|
||||
|
||||
/obj/item/weapon/robot_module/janitor
|
||||
name = "janitorial robot module"
|
||||
module_type = "Janitor"
|
||||
@@ -413,11 +430,11 @@
|
||||
|
||||
fix_modules()
|
||||
|
||||
/obj/item/weapon/robot_module/peacekeeper
|
||||
name = "peacekeeper robot module"
|
||||
/obj/item/weapon/robot_module/nations
|
||||
name = "nations robot module"
|
||||
module_type = "Malf"
|
||||
|
||||
/obj/item/weapon/robot_module/peacekeeper/New()
|
||||
/obj/item/weapon/robot_module/nations/New()
|
||||
..()
|
||||
modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src)
|
||||
modules += new /obj/item/weapon/gun/energy/gun/cyborg(src)
|
||||
@@ -482,6 +499,7 @@
|
||||
modules += new /obj/item/weapon/reagent_containers/spray/cleaner/drone(src)
|
||||
modules += new /obj/item/weapon/soap(src)
|
||||
modules += new /obj/item/device/t_scanner(src)
|
||||
modules += new /obj/item/weapon/rpd(src)
|
||||
|
||||
emag = new /obj/item/weapon/pickaxe/drill/cyborg/diamond(src)
|
||||
|
||||
|
||||
@@ -127,9 +127,6 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
|
||||
//Botany Worker Bees
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker
|
||||
//Blank type define in case we need to give them special stuff later, plus organization (currently they are same as base type bee)
|
||||
@@ -253,6 +250,9 @@
|
||||
if(S.reagents.has_reagent("royal_bee_jelly")) //checked twice, because I really don't want royal bee jelly to be duped
|
||||
if(S.reagents.has_reagent("royal_bee_jelly",5))
|
||||
S.reagents.remove_reagent("royal_bee_jelly", 5)
|
||||
if(!queen.beegent.can_synth)
|
||||
to_chat(user, "<span class='warning'>You inject [src] with the royal bee jelly. It's ineffective! Maybe it's something to do with the [src] reagent.</span>")
|
||||
return
|
||||
var/obj/item/queen_bee/qb = new(get_turf(user))
|
||||
qb.queen = new(qb)
|
||||
if(queen && queen.beegent)
|
||||
|
||||
@@ -97,8 +97,9 @@
|
||||
/mob/living/proc/update_stamina()
|
||||
return
|
||||
|
||||
/mob/living/on_varedit(modified_var)
|
||||
switch(modified_var)
|
||||
/mob/living/vv_edit_var(var_name, var_value)
|
||||
. = ..()
|
||||
switch(var_name)
|
||||
if("weakened")
|
||||
SetWeakened(weakened)
|
||||
if("stunned")
|
||||
@@ -120,5 +121,4 @@
|
||||
if("maxHealth")
|
||||
updatehealth()
|
||||
if("resize")
|
||||
update_transform()
|
||||
..()
|
||||
update_transform()
|
||||
+29
-1
@@ -684,7 +684,7 @@ var/list/slot_equipment_priority = list( \
|
||||
set src in usr
|
||||
if(usr != src)
|
||||
to_chat(usr, "No.")
|
||||
var/msg = input(usr,"Set the flavor text in your 'examine' verb. Can also be used for OOC notes about your character.","Flavor Text",html_decode(flavor_text)) as message|null
|
||||
var/msg = input(usr,"Set the flavor text in your 'examine' verb. The flavor text should be a physical descriptor of your character at a glance.","Flavor Text",html_decode(flavor_text)) as message|null
|
||||
|
||||
if(msg != null)
|
||||
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
|
||||
@@ -1237,3 +1237,31 @@ var/list/slot_equipment_priority = list( \
|
||||
|
||||
attack_log += new_log
|
||||
last_log = world.timeofday
|
||||
|
||||
/mob/vv_get_dropdown()
|
||||
. = ..()
|
||||
.["Show player panel"] = "?_src_=vars;mob_player_panel=[UID()]"
|
||||
|
||||
.["Give Spell"] = "?_src_=vars;give_spell=[UID()]"
|
||||
.["Give Disease"] = "?_src_=vars;give_disease=[UID()]"
|
||||
.["Toggle Godmode"] = "?_src_=vars;godmode=[UID()]"
|
||||
.["Toggle Build Mode"] = "?_src_=vars;build_mode=[UID()]"
|
||||
|
||||
.["Make 2spooky"] = "?_src_=vars;make_skeleton=[UID()]"
|
||||
|
||||
.["Assume Direct Control"] = "?_src_=vars;direct_control=[UID()]"
|
||||
.["Offer Control to Ghosts"] = "?_src_=vars;offer_control=[UID()]"
|
||||
.["Drop Everything"] = "?_src_=vars;drop_everything=[UID()]"
|
||||
|
||||
.["Regenerate Icons"] = "?_src_=vars;regenerateicons=[UID()]"
|
||||
.["Add Language"] = "?_src_=vars;addlanguage=[UID()]"
|
||||
.["Remove Language"] = "?_src_=vars;remlanguage=[UID()]"
|
||||
.["Add Organ"] = "?_src_=vars;addorgan=[UID()]"
|
||||
.["Remove Organ"] = "?_src_=vars;remorgan=[UID()]"
|
||||
|
||||
.["Fix NanoUI"] = "?_src_=vars;fix_nano=[UID()]"
|
||||
|
||||
.["Add Verb"] = "?_src_=vars;addverb=[UID()]"
|
||||
.["Remove Verb"] = "?_src_=vars;remverb=[UID()]"
|
||||
|
||||
.["Gib"] = "?_src_=vars;gib=[UID()]"
|
||||
@@ -65,14 +65,6 @@
|
||||
return
|
||||
|
||||
/mob/new_player/Stat()
|
||||
..()
|
||||
if((!ticker) || ticker.current_state == GAME_STATE_PREGAME)
|
||||
statpanel("Lobby") // First tab during pre-game.
|
||||
|
||||
statpanel("Status")
|
||||
if(client.statpanel == "Status" && ticker)
|
||||
if(ticker.current_state != GAME_STATE_PREGAME)
|
||||
stat(null, "Station Time: [worldtime2text()]")
|
||||
statpanel("Lobby")
|
||||
if(client.statpanel=="Lobby" && ticker)
|
||||
if(ticker.hide_mode)
|
||||
@@ -101,6 +93,14 @@
|
||||
if(player.ready)
|
||||
totalPlayersReady++
|
||||
|
||||
..()
|
||||
|
||||
statpanel("Status")
|
||||
if(client.statpanel == "Status" && ticker)
|
||||
if(ticker.current_state != GAME_STATE_PREGAME)
|
||||
stat(null, "Station Time: [worldtime2text()]")
|
||||
|
||||
|
||||
/mob/new_player/Topic(href, href_list[])
|
||||
if(!client) return 0
|
||||
|
||||
|
||||
@@ -279,9 +279,9 @@
|
||||
addtofield(text2num(id), t) // He wants to edit a field, let him.
|
||||
else
|
||||
info += t // Oh, he wants to edit to the end of the file, let him.
|
||||
updateinfolinks()
|
||||
|
||||
populatefields()
|
||||
updateinfolinks()
|
||||
|
||||
i.on_write(src,usr)
|
||||
|
||||
|
||||
@@ -428,7 +428,7 @@
|
||||
// if hands aren't protected and the light is on, burn the player
|
||||
|
||||
/obj/machinery/light/attack_hand(mob/user)
|
||||
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
add_fingerprint(user)
|
||||
|
||||
if(status == LIGHT_EMPTY)
|
||||
|
||||
@@ -156,7 +156,7 @@
|
||||
|
||||
// RPM function to include compression friction - be advised that too low/high of a compfriction value can make things screwy
|
||||
|
||||
rpm = max(0, rpm - (rpm*rpm)/(COMPFRICTION/efficiency))
|
||||
rpm = max(0, rpm - (rpm*rpm)/(COMPFRICTION*efficiency))
|
||||
|
||||
|
||||
if(starter && !(stat & NOPOWER))
|
||||
|
||||
@@ -182,16 +182,19 @@
|
||||
|
||||
/obj/item/ammo_box/magazine/m10mm/fire
|
||||
name = "pistol magazine (10mm incendiary)"
|
||||
icon_state = "9x19pI"
|
||||
desc = "A gun magazine. Loaded with rounds which ignite the target."
|
||||
ammo_type = /obj/item/ammo_casing/c10mm/fire
|
||||
|
||||
/obj/item/ammo_box/magazine/m10mm/hp
|
||||
name = "pistol magazine (10mm HP)"
|
||||
icon_state = "9x19pH"
|
||||
desc= "A gun magazine. Loaded with hollow-point rounds, extremely effective against unarmored targets, but nearly useless against protective clothing."
|
||||
ammo_type = /obj/item/ammo_casing/c10mm/hp
|
||||
|
||||
/obj/item/ammo_box/magazine/m10mm/ap
|
||||
name = "pistol magazine (10mm AP)"
|
||||
icon_state = "9x19pA"
|
||||
desc= "A gun magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets"
|
||||
ammo_type = /obj/item/ammo_casing/c10mm/ap
|
||||
|
||||
|
||||
@@ -163,13 +163,14 @@
|
||||
playsound(loc, 'sound/weapons/empty.ogg', 50, 1, -1)
|
||||
return (OXYLOSS)
|
||||
|
||||
/obj/item/weapon/gun/energy/on_varedit(modified_var)
|
||||
if(modified_var == "selfcharge")
|
||||
if(selfcharge)
|
||||
processing_objects.Add(src)
|
||||
else
|
||||
processing_objects.Remove(src)
|
||||
..()
|
||||
/obj/item/weapon/gun/energy/vv_edit_var(var_name, var_value)
|
||||
switch(var_name)
|
||||
if("selfcharge")
|
||||
if(var_value)
|
||||
processing_objects.Add(src)
|
||||
else
|
||||
processing_objects.Remove(src)
|
||||
. = ..()
|
||||
|
||||
/obj/item/weapon/gun/energy/proc/robocharge()
|
||||
if(isrobot(loc))
|
||||
|
||||
@@ -604,13 +604,13 @@
|
||||
/datum/reagent/consumable/ethanol/manhattan_proj
|
||||
name = "Manhattan Project"
|
||||
id = "manhattan_proj"
|
||||
description = "A scienitst's drink of choice, for pondering ways to blow up the station."
|
||||
description = "A scientist's drink of choice, for pondering ways to blow up the station."
|
||||
reagent_state = LIQUID
|
||||
color = "#664300" // rgb: 102, 67, 0
|
||||
alcohol_perc = 0.4
|
||||
drink_icon = "proj_manhattanglass"
|
||||
drink_name = "Manhattan Project"
|
||||
drink_desc = "A scienitst drink of choice, for thinking how to blow up the station."
|
||||
drink_desc = "A scientist's drink of choice, for thinking how to blow up the station."
|
||||
taste_message = "bitter alcohol"
|
||||
|
||||
/datum/reagent/consumable/ethanol/whiskeysoda
|
||||
|
||||
@@ -1132,3 +1132,30 @@
|
||||
M.electrocute_act(rand(5,20), "Teslium in their body", 1, 1) //Override because it's caused from INSIDE of you
|
||||
playsound(M, "sparks", 50, 1)
|
||||
..()
|
||||
|
||||
/datum/reagent/peaceborg/confuse
|
||||
name = "Dizzying Solution"
|
||||
id = "dizzysolution"
|
||||
description = "Makes the target off balance and dizzy"
|
||||
metabolization_rate = 1.5 * REAGENTS_METABOLISM
|
||||
|
||||
/datum/reagent/peaceborg/confuse/on_mob_life(mob/living/M)
|
||||
M.AdjustConfused(3, bound_lower = 0, bound_upper = 5)
|
||||
M.AdjustDizzy(3, bound_lower = 0, bound_upper = 5)
|
||||
if(prob(20))
|
||||
to_chat(M, "<span class='warning'>You feel confused and disorientated.</span>")
|
||||
..()
|
||||
|
||||
/datum/reagent/peaceborg/tire
|
||||
name = "Tiring Solution"
|
||||
id = "tiresolution"
|
||||
description = "An extremely weak stamina-toxin that tires out the target. Completely harmless."
|
||||
metabolization_rate = 1.5 * REAGENTS_METABOLISM
|
||||
|
||||
/datum/reagent/peaceborg/tire/on_mob_life(mob/living/M)
|
||||
var/healthcomp = (M.maxHealth - M.health)
|
||||
if(M.staminaloss < (45 - healthcomp)) //At 50 health you would have 200 - 150 health meaning 50 compensation. 60 - 50 = 10, so would only do 10-19 stamina.)
|
||||
M.adjustStaminaLoss(10)
|
||||
if(prob(30))
|
||||
to_chat(M, "<span class='warning'>You feel like you should sit down and take a rest...</span>")
|
||||
..()
|
||||
@@ -15,8 +15,8 @@
|
||||
var/bypass_protection = 0 //If the hypospray can go through armor or thick material
|
||||
|
||||
var/list/datum/reagents/reagent_list = list()
|
||||
var/list/reagent_ids = list("salglu_solution", "epinephrine", "spaceacillin", "charcoal")
|
||||
//var/list/reagent_ids = list("salbutamol", "silver_sulfadiazine", "styptic_powder", "charcoal", "epinephrine", "spaceacillin")
|
||||
var/list/reagent_ids = list("salglu_solution", "epinephrine", "spaceacillin", "charcoal", "hydrocodone")
|
||||
//var/list/reagent_ids = list("salbutamol", "silver_sulfadiazine", "styptic_powder", "charcoal", "epinephrine", "spaceacillin", "hydrocodone")
|
||||
|
||||
/obj/item/weapon/reagent_containers/borghypo/surgeon
|
||||
reagent_ids = list("styptic_powder", "epinephrine", "salbutamol")
|
||||
@@ -33,6 +33,15 @@
|
||||
reagent_ids = list("syndicate_nanites", "potass_iodide", "ether")
|
||||
bypass_protection = 1
|
||||
|
||||
/obj/item/weapon/reagent_containers/borghypo/peace
|
||||
name = "Peace Hypospray"
|
||||
reagent_ids = list("dizzysolution","tiresolution")
|
||||
|
||||
/obj/item/weapon/reagent_containers/borghypo/peace/hacked
|
||||
desc = "Everything's peaceful in death!"
|
||||
icon_state = "borghypo_s"
|
||||
reagent_ids = list("dizzysolution","tiresolution","tirizene","sulfonal","sodium_thiopental","cyanide","neurotoxin2")
|
||||
|
||||
/obj/item/weapon/reagent_containers/borghypo/New()
|
||||
..()
|
||||
for(var/R in reagent_ids)
|
||||
@@ -118,4 +127,4 @@
|
||||
empty = 0
|
||||
|
||||
if(empty)
|
||||
to_chat(user, "<span class='notice'>It is currently empty. Allow some time for the internal syntheszier to produce more.</span>")
|
||||
to_chat(user, "<span class='notice'>It is currently empty. Allow some time for the internal syntheszier to produce more.</span>")
|
||||
|
||||
@@ -253,6 +253,14 @@
|
||||
explosion(loc, 0, 3, 5, 7, 10)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/reagent_dispensers/beerkeg/nuke
|
||||
name = "Nanotrasen-brand nuclear fission explosive"
|
||||
desc = "One of the more successful achievements of the Nanotrasen Corporate Warfare Division, their nuclear fission explosives are renowned for being cheap\
|
||||
to produce and devestatingly effective. Signs explain that though this is just a model, every Nanotrasen station is equipped with one, just in case. \
|
||||
All Captains carefully guard the disk needed to detonate them - at least, the sign says they do. There seems to be a tap on the back."
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "nuclearbomb0"
|
||||
|
||||
/obj/structure/reagent_dispensers/virusfood
|
||||
name = "virus food dispenser"
|
||||
desc = "A dispenser of low-potency virus mutagenic."
|
||||
|
||||
@@ -608,6 +608,14 @@
|
||||
build_path = /obj/item/weapon/rcd
|
||||
category = list("hacked", "Construction")
|
||||
|
||||
/datum/design/rpd
|
||||
name = "Rapid Pipe Dispenser (RPD)"
|
||||
id = "rpd"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(MAT_METAL = 75000, MAT_GLASS = 37500)
|
||||
build_path = /obj/item/weapon/rpd
|
||||
category = list("hacked", "Construction")
|
||||
|
||||
/datum/design/rcl
|
||||
name = "Rapid Cable Layer"
|
||||
id = "rcl"
|
||||
@@ -855,4 +863,13 @@
|
||||
build_type = AUTOLATHE
|
||||
materials = list(MAT_GLASS = 750, MAT_METAL = 250)
|
||||
build_path = /obj/item/weapon/circuitboard/vendor
|
||||
category = list("initial", "Electronics")
|
||||
category = list("initial", "Electronics")
|
||||
|
||||
/datum/design/mirror
|
||||
name = "mirror"
|
||||
desc = "A mountable mirror."
|
||||
id = "mirror"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(MAT_GLASS = 2500) //1.25 glass sheets, broken mirrors will return a shard (1 sheet)
|
||||
build_path = /obj/item/mounted/mirror
|
||||
category = list("initial", "Miscellaneous")
|
||||
@@ -984,7 +984,7 @@
|
||||
/datum/design/mech_immolator
|
||||
name = "Exosuit Weapon (ZFI Immolation Beam Gun)"
|
||||
desc = "Allows for the construction of ZFI Immolation Beam Gun."
|
||||
id = "mech_tesla"
|
||||
id = "mech_immolator"
|
||||
build_type = MECHFAB
|
||||
req_tech = list("combat" = 6, "magnets" = 5, "materials" = 5)
|
||||
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/immolator
|
||||
|
||||
@@ -140,6 +140,9 @@ var/global/list/obj/machinery/message_server/message_servers = list()
|
||||
variable = param_variable
|
||||
value = param_value
|
||||
|
||||
/datum/feedback_variable/vv_edit_var(var_name, var_value)
|
||||
return FALSE // come on guys don't break the stats
|
||||
|
||||
/datum/feedback_variable/proc/inc(var/num = 1)
|
||||
if(isnum(value))
|
||||
value += num
|
||||
@@ -189,6 +192,7 @@ var/global/list/obj/machinery/message_server/message_servers = list()
|
||||
|
||||
var/obj/machinery/blackbox_recorder/blackbox
|
||||
|
||||
//TODO: kill whoever designed this cancer
|
||||
/obj/machinery/blackbox_recorder
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "blackbox"
|
||||
@@ -314,6 +318,9 @@ var/obj/machinery/blackbox_recorder/blackbox
|
||||
var/DBQuery/query_insert = dbcon.NewQuery(sql)
|
||||
query_insert.Execute()
|
||||
|
||||
/obj/machinery/blackbox_recorder/vv_edit_var(var_name, var_value)
|
||||
return FALSE // don't fuck with the stupid blackbox shit
|
||||
|
||||
|
||||
proc/feedback_set(var/variable,var/value)
|
||||
if(!blackbox) return
|
||||
|
||||
Reference in New Issue
Block a user