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() + ..()