diff --git a/code/defines/procs/statistics.dm b/code/defines/procs/statistics.dm index 810bfb79aa..8a9eb4042d 100644 --- a/code/defines/procs/statistics.dm +++ b/code/defines/procs/statistics.dm @@ -47,9 +47,8 @@ proc/sql_report_death(var/mob/living/carbon/human/H) if(!H.key || !H.mind) return - var/turf/T = H.loc - var/area/placeofdeath = get_area(T.loc) - var/podname = placeofdeath.name + var/area/placeofdeath = get_area(H) + var/podname = placeofdeath ? placeofdeath.name : "Unknown area" var/sqlname = sanitizeSQL(H.real_name) var/sqlkey = sanitizeSQL(H.key) @@ -82,9 +81,8 @@ proc/sql_report_cyborg_death(var/mob/living/silicon/robot/H) if(!H.key || !H.mind) return - var/turf/T = H.loc - var/area/placeofdeath = get_area(T.loc) - var/podname = placeofdeath.name + var/area/placeofdeath = get_area(H) + var/podname = placeofdeath ? placeofdeath.name : "Unknown area" var/sqlname = sanitizeSQL(H.real_name) var/sqlkey = sanitizeSQL(H.key) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 1a20fd29ef..bb99773362 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -158,7 +158,7 @@ for(var/mob/living/silicon/ai/O in living_mob_list) if(!O.client) continue if(U.name == "Unknown") O << "[U] holds \a [itemname] up to one of your cameras ..." - else O << "[U] holds \a [itemname] up to one of your cameras ..." + else O << "[U] holds \a [itemname] up to one of your cameras ..." O << browse(text("[][]", itemname, info), text("window=[]", itemname)) for(var/mob/O in player_list) if (istype(O.machine, /obj/machinery/computer/security)) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 14c70df792..6b079ef1ac 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -669,6 +669,17 @@ var/list/admin_verbs_mentor = list( log_admin("[key_name(usr)] used 'kill air'.") message_admins("\blue [key_name_admin(usr)] used 'kill air'.", 1) +/client/proc/readmin_self() + set name = "Re-Admin self" + set category = "Admin" + + if(deadmin_holder) + deadmin_holder.reassociate() + log_admin("[src] re-admined themself.") + message_admins("[src] re-admined themself.", 1) + src << "You now have the keys to control the planet, or atleast a small space station" + verbs -= /client/proc/readmin_self + /client/proc/deadmin_self() set name = "De-admin self" set category = "Admin" @@ -679,6 +690,7 @@ var/list/admin_verbs_mentor = list( message_admins("[src] deadmined themself.", 1) deadmin() src << "You are now a normal player." + verbs |= /client/proc/readmin_self feedback_add_details("admin_verb","DAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_log_hrefs() diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index f5e2ac61cd..d1cc15b0fe 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -34,8 +34,16 @@ var/list/admin_datums = list() if(owner) admins -= owner owner.remove_admin_verbs() + owner.deadmin_holder = owner.holder owner.holder = null - owner = null + +/datum/admins/proc/reassociate() + if(owner) + admins += owner + owner.holder = src + owner.deadmin_holder = null + owner.add_admin_verbs() + /* checks if usr is an admin with at least ONE of the flags in rights_required. (Note, they don't need all the flags) @@ -82,8 +90,7 @@ you will have to do something like if(client.holder.rights & R_ADMIN) yourself. /client/proc/deadmin() - admin_datums -= ckey if(holder) holder.disassociate() - del(holder) + //del(holder) return 1 diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index 81f53ec4d2..1155882b82 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -3,6 +3,7 @@ //ADMIN THINGS// //////////////// var/datum/admins/holder = null + var/datum/admins/deadmin_holder = null var/buildmode = 0 var/last_message = "" //Contains the last message sent by this client - used to protect against copy-paste spamming. diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm index 806e9a331e..85ee89a89a 100644 --- a/code/modules/events/event_manager.dm +++ b/code/modules/events/event_manager.dm @@ -32,7 +32,7 @@ EC.process() /datum/event_manager/proc/event_complete(var/datum/event/E) - if(!E.event_meta) // datum/event is used here and there for random reasons, maintaining "backwards compatibility" + if(!E.event_meta || !E.severity) // datum/event is used here and there for random reasons, maintaining "backwards compatibility" log_debug("Event of '[E.type]' with missing meta-data has completed.") return diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 720abe8e2a..1fc34e8dea 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -858,9 +858,11 @@ note dizziness decrements automatically in the mob's Life() proc. canmove = 1 pixel_y = V.mob_offset_y else if(buckled) - if(buckled.buckle_lying != -1) lying = buckled.buckle_lying - if (!buckled.buckle_movable) - anchored = 1 + if(buckled.buckle_lying != -1) + lying = buckled.buckle_lying + // var/movable is defined at /obj/structure/stool/bed level + // If we're buckled to something else, such as vines, assume it's stationary. + if (!istype(buckled) || !buckled.movable) anchored = 1 canmove = 0 else anchored = 0 diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 0a6b6ede8e..912d473e6c 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -392,6 +392,9 @@ nanoui is used to open and update nano browser uis * @return nothing */ /datum/nanoui/proc/open() + if(!user.client) + return + var/window_size = "" if (width && height) window_size = "size=[width]x[height];" diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index ac9b3131cd..b04d631046 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -97,7 +97,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 if(!pale) pale = 1 update_body() - eye_blurry += 6 + eye_blurry = max(eye_blurry,6) if(oxyloss < 50) oxyloss += 10 oxyloss += 1 @@ -329,4 +329,4 @@ proc/blood_splatter(var/target,var/datum/reagent/blood/source,var/large) if(source.data["virus2"]) B.virus2 = virus_copylist(source.data["virus2"]) - return B \ No newline at end of file + return B diff --git a/code/modules/virus2/helpers.dm b/code/modules/virus2/helpers.dm index a9ffedbca1..feb7aec6a6 100644 --- a/code/modules/virus2/helpers.dm +++ b/code/modules/virus2/helpers.dm @@ -11,16 +11,17 @@ proc/infection_check(var/mob/living/carbon/M, var/vector = "Airborne") if(M.internal) score = 6 //not breathing infected air helps greatly var/obj/item/I = M.wear_mask - + //masks provide a small bonus and can replace overall bio protection - score = max(score, round(0.06*I.armor["bio"])) - if (istype(I, /obj/item/clothing/mask)) - score += 1 //this should be added after - + if(I) + score = max(score, round(0.06*I.armor["bio"])) + if (istype(I, /obj/item/clothing/mask)) + score += 1 //this should be added after + if("Contact") if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M - + //gloves provide a larger bonus if (istype(H.gloves, /obj/item/clothing/gloves)) score += 2 @@ -45,12 +46,12 @@ proc/infection_check(var/mob/living/carbon/M, var/vector = "Airborne") return 0 var/protection = M.getarmor(null, "bio") //gets the full body bio armour value, weighted by body part coverage. - + if (vector == "Airborne") var/obj/item/I = M.wear_mask if (istype(I)) protection = max(protection, round(0.06*I.armor["bio"])) - + return prob(protection) //Checks if table-passing table can reach target (5 tile radius) @@ -134,7 +135,7 @@ proc/airborne_can_reach(turf/source, turf/target) // log_debug("Attempting virus [ID]") var/datum/disease2/disease/V = virus2[ID] if(V.spreadtype != vector) continue - + //It's hard to get other people sick if you're in an airtight suit. if(!infection_spreading_check(src, V.spreadtype)) continue