diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index 0ee843fe85c..dd51696c118 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -105,13 +105,13 @@
var/photo
var/dat
var/stamped = 0
-
+
var/obj/item/weapon/card/id/guest/guest_pass = null // Guest pass attached to the ID
/obj/item/weapon/card/id/New()
..()
spawn(30)
- if(ishuman(loc))
+ if(ishuman(loc) && blood_type == "\[UNSET\]")
var/mob/living/carbon/human/H = loc
SetOwnerInfo(H)
@@ -242,10 +242,10 @@
set name = "Remove Guest Pass"
set category = "Object"
set src in range(0)
-
+
if(usr.stat || !usr.canmove || usr.restrained())
return
-
+
if(guest_pass)
to_chat(usr, "You remove the guest pass from this ID.")
guest_pass.forceMove(get_turf(src))
@@ -253,6 +253,37 @@
else
to_chat(usr, "There is no guest pass attached to this ID")
+/obj/item/weapon/card/id/serialize()
+ var/list/data = ..()
+
+ data["sex"] = sex
+ data["age"] = age
+ data["btype"] = blood_type
+ data["dna_hash"] = dna_hash
+ data["fprint_hash"] = fingerprint_hash
+ data["access"] = access
+ data["job"] = assignment
+ data["account"] = associated_account_number
+ data["owner"] = registered_name
+ data["mining"] = mining_points
+ return data
+
+/obj/item/weapon/card/id/deserialize(list/data)
+ sex = data["sex"]
+ age = data["age"]
+ blood_type = data["btype"]
+ dna_hash = data["dna_hash"]
+ fingerprint_hash = data["fprint_hash"]
+ access = data["access"] // No need for a copy, the list isn't getting touched
+ assignment = data["job"]
+ associated_account_number = data["account"]
+ registered_name = data["owner"]
+ mining_points = data["mining"]
+ // We'd need to use icon serialization(b64) to save the photo, and I don't feel like i
+ UpdateName()
+ RebuildHTML()t
+ ..()
+
/obj/item/weapon/card/id/silver
name = "identification card"
desc = "A silver card which shows honour and dedication."
@@ -767,4 +798,4 @@
if("TDgreen")
return "Thunderdome Green"
else
- return capitalize(skin)
\ No newline at end of file
+ return capitalize(skin)
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index a0e3d4dd69e..23f8f9ea685 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -37,7 +37,9 @@
src.add_fingerprint(usr)
return
-
+/obj/item/weapon/storage/belt/deserialize(list/data)
+ ..()
+ update_icon()
/obj/item/weapon/storage/belt/utility
name = "tool-belt" //Carn: utility belt is nicer, but it bamboozles the text parsing.
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index e2324fcb434..e792d38afd7 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -541,3 +541,34 @@
return depth
+/obj/item/weapon/storage/serialize()
+ var data = ..()
+ var/list/content_list = list()
+ data["content"] = content_list
+ data["slots"] = storage_slots
+ data["max_w_class"] = max_w_class
+ data["max_c_w_class"] = max_combined_w_class
+ for(var/thing in contents)
+ var/atom/movable/AM = thing
+ // This code does not watch out for infinite loops
+ // But then again a tesseract would destroy the server anyways
+ // Also I wish I could just insert a list instead of it reading it the wrong way
+ content_list.len++
+ content_list[content_list.len] = AM.serialize()
+ return data
+
+/obj/item/weapon/storage/deserialize(list/data)
+ if(isnum(data["slots"]))
+ storage_slots = data["slots"]
+ if(isnum(data["max_w_class"]))
+ max_w_class = data["max_w_class"]
+ if(isnum(data["max_c_w_class"]))
+ max_combined_w_class = data["max_c_w_class"]
+ for(var/thing in contents)
+ qdel(thing) // out with the old
+ for(var/thing in data["content"])
+ if(islist(thing))
+ list_to_object(thing, src)
+ else
+ log_debug("Non-list thing: [thing]. We are a [name]")
+ ..()
diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm
index 360c9b2915f..faf5f389e9d 100644
--- a/code/modules/clothing/suits/storage.dm
+++ b/code/modules/clothing/suits/storage.dm
@@ -50,3 +50,12 @@
if(istype(G.gift, /obj/item/weapon/storage))
L += G.gift:return_inv()
return L
+
+/obj/item/clothing/suit/storage/serialize()
+ var/list/data = ..()
+ data["pockets"] = pockets.serialize()
+ return data
+
+/obj/item/clothing/suit/storage/deserialize(list/data)
+ qdel(pockets)
+ pockets = list_to_object(data["pockets"], src)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 12cabc68a5f..c63c03d8321 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -2037,10 +2037,20 @@
var/list/data = ..()
var/list/limbs_list = list()
var/list/organs_list = list()
+ var/list/equip_list = list()
data["limbs"] = limbs_list
data["iorgans"] = organs_list
+ data["equip"] = equip_list
+
data["dna"] = dna.serialize()
+ data["age"] = age
+
+ // No being naked
data["ushirt"] = undershirt
+ data["socks"] = socks
+ data["uwear"] = underwear
+
+ // Limbs
for(var/limb in organs_by_name)
var/obj/item/organ/O = organs_by_name[limb]
if(!O)
@@ -2049,15 +2059,25 @@
limbs_list[limb] = O.serialize()
+ // Internal organs/augments
for(var/organ in internal_organs)
var/obj/item/organ/O = organ
organs_list[O.name] = O.serialize()
- return json_encode(data)
+ // Equipment
+ equip_list.len = slots_amt
+ for(var/i = 1, i < slots_amt, i++)
+ var/obj/item/thing = get_item_by_slot(i)
+ if(thing != null)
+ equip_list[i] = thing.serialize()
+
+ return data
/mob/living/carbon/human/deserialize(list/data)
var/list/limbs_list = data["limbs"]
var/list/organs_list = data["iorgans"]
+ var/list/equip_list = data["equip"]
+ var/turf/T = get_turf(src)
if(!islist(data["limbs"]))
throw EXCEPTION("Expected a limbs list, but found none")
@@ -2067,7 +2087,10 @@
name = real_name
UpdateAppearance()
set_species(dna.species)
+ age = data["age"]
undershirt = data["ushirt"]
+ underwear = data["uwear"]
+ socks = data["socks"]
for(var/obj/item/organ/internal/iorgan in internal_organs)
qdel(iorgan)
@@ -2085,5 +2108,26 @@
for(var/organ in organs_list)
// As above, "New" code handles insertion, DNA sync
list_to_object(organs_list[organ], src)
+
+
+ // De-serialize equipment
+ // #1: Jumpsuit
+ // #2: Outer suit
+ // #3+: Everything else
+ if(islist(equip_list[slot_w_uniform]))
+ var/obj/item/clothing/C = list_to_object(equip_list[slot_w_uniform], T)
+ equip_to_slot_if_possible(C, slot_w_uniform)
+
+ if(islist(equip_list[slot_wear_suit]))
+ var/obj/item/clothing/C = list_to_object(equip_list[slot_wear_suit], T)
+ equip_to_slot_if_possible(C, slot_wear_suit)
+
+ for(var/i = 1, i < slots_amt, i++)
+ if(i == slot_w_uniform || i == slot_wear_suit)
+ continue
+ if(islist(equip_list[i]))
+ var/obj/item/clothing/C = list_to_object(equip_list[i], T)
+ equip_to_slot_if_possible(C, i)
update_icons()
+
..()