diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index e97de99feff..b7ac60b84d7 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -39,6 +39,8 @@
return debug_variable(var_name, list(), 0, src)
return debug_variable(var_name, vars[var_name], 0, src)
+/datum/proc/can_vv_delete()
+ return TRUE
//please call . = ..() first and append to the result, that way parent items are always at the top and child items are further down
//add seperaters by doing . += "---"
@@ -722,6 +724,16 @@
to_chat(M, "There were no ghosts willing to take control.")
message_admins("No ghosts were willing to take control of [key_name_admin(M)])")
+ else if(href_list["delete"])
+ if(!check_rights(R_DEBUG, 0))
+ return
+
+ var/datum/D = locateUID(href_list["delete"])
+ if(!D)
+ to_chat(usr, "Unable to locate item!")
+ admin_delete(D)
+ href_list["datumrefresh"] = href_list["delete"]
+
else if(href_list["delall"])
if(!check_rights(R_DEBUG|R_SERVER)) return
diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm
index d2d0a6c7ab5..f3715eaab31 100644
--- a/code/modules/admin/holder2.dm
+++ b/code/modules/admin/holder2.dm
@@ -102,4 +102,7 @@ you will have to do something like if(client.holder.rights & R_ADMIN) yourself.
return 0
/datum/admins/vv_edit_var(var_name, var_value)
- return FALSE // no admin abuse
\ No newline at end of file
+ return FALSE // no admin abuse
+
+/datum/admins/can_vv_delete()
+ return FALSE // don't break shit either
\ No newline at end of file
diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
index 7b111e8ed20..859ff3ecf2b 100644
--- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm
+++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
@@ -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, "It is forbidden to run this object's procs.")
- return
-
if(object == world) // Global proc.
procname = "/proc/[procname]"
return call(procname)(arglist(new_args))
diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm
index 3ffdc455045..0ad266ecaa1 100644
--- a/code/modules/admin/verbs/modifyvariables.dm
+++ b/code/modules/admin/verbs/modifyvariables.dm
@@ -1,21 +1,7 @@
-var/list/forbidden_varedit_object_types = list(
- /datum/admins, //Admins editing their own admin-power object? Yup, sounds like a good idea.
- /obj/machinery/blackbox_recorder, //Prevents people messing with feedback gathering
- /datum/feedback_variable //Prevents people messing with feedback gathering
- )
-
var/list/VVlocked = list("vars", "var_edited", "client", "firemut", "ishulk", "telekinesis", "xray", "ka", "virus", "viruses", "cuffed", "last_eaten", "unlock_content") // R_DEBUG
var/list/VVicon_edit_lock = list("icon", "icon_state", "overlays", "underlays", "resize") // R_EVENT | R_DEBUG
var/list/VVckey_edit = list("key", "ckey") // R_EVENT | R_DEBUG
var/list/VVpixelmovement = list("step_x", "step_y", "bound_height", "bound_width", "bound_x", "bound_y") // R_DEBUG + warning
-
-/proc/datum_is_forbidden(type)
- for(var/p in forbidden_varedit_object_types)
- if(istype(type, p))
- to_chat(usr, "It is forbidden to tamper with this object.")
- return FALSE
- return TRUE
-
/client/proc/vv_get_class(var/var_value)
if(isnull(var_value))
. = VV_NULL
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index fdfbdfba6b2..ccae0db2988 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -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"
diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm
index 52fa9596d92..86d507d34de 100644
--- a/code/modules/research/message_server.dm
+++ b/code/modules/research/message_server.dm
@@ -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