diff --git a/code/datums/configuration.dm b/code/datums/configuration.dm
index 46b38c2f745..3cef703980d 100644
--- a/code/datums/configuration.dm
+++ b/code/datums/configuration.dm
@@ -33,6 +33,7 @@
var/traitor_scaling = 0 //if amount of traitors scales based on amount of players
var/protect_roles_from_antagonist = 0// If security and such can be tratior/cult/other
var/Tensioner_Active = 0 // If the tensioner is running.
+ var/allow_Metadata = 0 // Metadata is supported.
var/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1.
var/list/mode_names = list()
@@ -234,6 +235,9 @@
if ("feature_object_spell_system")
config.feature_object_spell_system = 1
+ if ("allow_metadata")
+ config.allow_Metadata = 1
+
if ("traitor_scaling")
config.traitor_scaling = 1
diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm
index a0ca95b0413..1388a1314c1 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/life.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm
@@ -14,8 +14,12 @@
if (src.monkeyizing)
return
+ ..()
+
if (src.stat != 2) //still breathing
+
+
//First, resolve location and get a breath
if(air_master.current_cycle%4==2)
diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm
index ae61bbfa032..b975d969cbe 100644
--- a/code/modules/mob/living/carbon/alien/larva/life.dm
+++ b/code/modules/mob/living/carbon/alien/larva/life.dm
@@ -14,6 +14,8 @@
if (monkeyizing)
return
+ ..()
+
if (stat != 2) //still breathing
//First, resolve location and get a breath
diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm
index 581179cdd8b..4106a1b0144 100644
--- a/code/modules/mob/living/carbon/brain/life.dm
+++ b/code/modules/mob/living/carbon/brain/life.dm
@@ -4,6 +4,8 @@
set invisibility = 0
set background = 1
+ ..()
+
var/datum/gas_mixture/environment // Added to prevent null location errors-- TLE
if(loc)
environment = loc.return_air()
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 7aeed963ce2..317e9824c8e 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -25,6 +25,8 @@
if(!loc) // Fixing a null error that occurs when the mob isn't found in the world -- TLE
return
+ ..()
+
//Being buckled to a chair or bed
check_if_buckled()
@@ -125,8 +127,6 @@
if(!currentTurf.sd_lumcount)
playsound_local(src,pick(scarySounds),50, 1, -1)
- ..() //for organs
-
src.moved_recently = max(0, moved_recently-1)
/mob/living/carbon/human
@@ -457,8 +457,10 @@
return null
update_canmove()
- if(paralysis || resting || stunned || weakened || buckled || (changeling && changeling.changeling_fakedeath)) canmove = 0
- else canmove = 1
+ if(paralysis || stunned || weakened || resting || buckled || (changeling && changeling.changeling_fakedeath))
+ canmove = 0
+ else
+ canmove = 1
handle_breath(datum/gas_mixture/breath)
if(nodamage || (mutations & mNobreath))
diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm
index 737872121ca..a4b12e934ce 100644
--- a/code/modules/mob/living/carbon/metroid/life.dm
+++ b/code/modules/mob/living/carbon/metroid/life.dm
@@ -5,6 +5,7 @@
if (src.monkeyizing)
return
+ ..()
var/datum/gas_mixture/environment // Added to prevent null location errors-- TLE
if(src.loc)
diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm
index f5780ed9c83..ab616822cee 100644
--- a/code/modules/mob/living/carbon/monkey/life.dm
+++ b/code/modules/mob/living/carbon/monkey/life.dm
@@ -23,6 +23,8 @@
if (src.monkeyizing)
return
+ ..()
+
var/datum/gas_mixture/environment // Added to prevent null location errors-- TLE
if(src.loc)
environment = loc.return_air()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 28b98787c1d..f272027a12a 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1,3 +1,19 @@
+/mob/living/Life()
+
+ ..()
+
+ // While I'm doing a terriblly lazy way of initalizing things, why don't I make it so people's preferences tag along with them. This could be useful in fixing the fucking cloned-as-unknown thing, making me not have to dynamically load them during tensioner, and of course, storing metadata.
+
+ if(!src.storedpreferences)
+ src.storedpreferences = new
+ storedpreferences.savefile_load(src, 0)
+
+
+
+
+ return
+
+
/mob/living/verb/succumb()
set hidden = 1
if ((src.health < 0 && src.health > -95.0))
@@ -227,6 +243,26 @@
else
density = !lying
+
+/mob/living/proc/Examine_OOC()
+ set name = "Examine Meta-Info (OOC)"
+ set category = "OOC"
+ set src in view()
+
+ if(config.allow_Metadata)
+ usr << "[src]'s Metainfo:"
+
+ if(src.storedpreferences)
+ usr << "[src]'s OOC Notes: [src.storedpreferences.metadata]"
+
+ else
+ usr << "[src] does not have any stored infomation!"
+
+ else
+ usr << "OOC Metadata is not supported by this server!"
+
+ return
+
/mob/living/attack_animal(mob/M)
attack_paw(M) // treat it like a normal non-human attack
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 096a517213e..1c459ef1769 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -142,8 +142,9 @@
//world << "channel_prefix=[channel_prefix]; message_mode=[message_mode]"
if (message_mode)
message = trim(copytext(message, 3))
- if (!ishuman(src) && (message_mode=="department" || (message_mode in radiochannels)))
+ if (!(ishuman(src) || istype(src, /mob/living/simple_animal)) && (message_mode=="department" || (message_mode in radiochannels)))
message_mode = null //only humans can use headsets
+ // Check removed so parrots can use headsets!
if (!message)
return
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index a727014738f..87c6a95b5cb 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -282,9 +282,10 @@ the mob is also allowed to move without any sort of restriction. For instance, i
var/digitalcamo = 0 // Can they be tracked by the AI?
-
var/list/organs = list( ) //List of organs.
var/list/organs2 = list()
//Singularity wants you!
var/grav_delay = 0
var/being_strangled = 0
+
+ var/datum/preferences/storedpreferences = null
\ No newline at end of file
diff --git a/code/modules/mob/new_player/preferences.dm b/code/modules/mob/new_player/preferences.dm
index 194f4af8c92..54ac7295b6d 100644
--- a/code/modules/mob/new_player/preferences.dm
+++ b/code/modules/mob/new_player/preferences.dm
@@ -129,6 +129,10 @@ datum/preferences
skill_specialization = null
list/skills = list() // skills can range from 0 to 3
+ // OOC Metadata:
+ metadata = ""
+
+
New()
hair_style = new/datum/sprite_accessory/hair/short
facial_hair_style = new/datum/sprite_accessory/facial_hair/shaved
@@ -243,6 +247,8 @@ datum/preferences
dat += "UI Style: [UI == UI_NEW ? "New" : "Old"]
"
dat += "Play admin midis: [midis == 1 ? "Yes" : "No"]
"
dat += "Ghost ears: [ghost_ears == 0 ? "Nearest Creatures" : "All Speech"]
"
+ if(config.allow_Metadata)
+ dat += "OOC Notes: Edit
"
if((user.client) && (user.client.holder) && (user.client.holder.rank) && (user.client.holder.rank == "Game Master"))
dat += "
"
+ if(ears)
+ dat += "
Headset: [ears] (Remove)"
+ else
+ dat += "
Headset: Nothing"
+
+ user << browse(dat, text("window=mob[];size=325x500", name))
+ onclose(user, "mob[real_name]")
+ return
+
+
+
+/mob/living/simple_animal/parrot/Topic(href, href_list)
+ if(usr.stat) return
+
+ //Removing from inventory
+ if(href_list["remove_inv"])
+ if(get_dist(src,usr) > 1 || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr)))
+ return
+ var/remove_from = href_list["remove_inv"]
+ switch(remove_from)
+ if("ears")
+ if(ears)
+ src.say(":e BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
+ ears.loc = src.loc
+ ears = null
+ else
+ usr << "\red There is nothing to remove from its [remove_from]."
+ return
+
+ //Adding things to inventory
+ else if(href_list["add_inv"])
+ if(get_dist(src,usr) > 1 || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr)))
+ return
+ var/add_to = href_list["add_inv"]
+ if(!usr.get_active_hand())
+ usr << "\red You have nothing in your hand to put on its [add_to]."
+ return
+ switch(add_to)
+ if("ears")
+ if(ears)
+ usr << "\red It's already wearing something."
+ return
+ else
+ var/obj/item/item_to_add = usr.get_active_hand()
+ if(!item_to_add)
+ return
+
+ if( !istype(item_to_add, /obj/item/device/radio/headset) )
+ usr << "\red This object won't fit."
+ return
+
+ usr.drop_item()
+ item_to_add.loc = src
+ src.ears = item_to_add
+ else
+ ..()
diff --git a/code/setup.dm b/code/setup.dm
index c3e5a03ce55..26847325425 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -1,3 +1,5 @@
+#define PI 3.1415
+
#define R_IDEAL_GAS_EQUATION 8.31 //kPa*L/(K*mol)
#define ONE_ATMOSPHERE 101.325 //kPa
diff --git a/config/config.txt b/config/config.txt
index 9baff060164..1ba35446cc4 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -80,6 +80,10 @@ TRAITOR_SCALING
## If the auto-tensioner is active by default. It creates more tratiors/other antagonists if it consideers the round slowing down.
#TENSIONER_ACTIVE
+
+## If metadata is supported
+ALLOW_METADATA
+
## allow players to initiate a restart vote
ALLOW_VOTE_RESTART