From 555d80ae21defed20ce566e795a6bd5326189fc5 Mon Sep 17 00:00:00 2001 From: AnturK Date: Thu, 27 Feb 2020 20:08:53 +0100 Subject: [PATCH] Persistent painting fixup --- code/__DEFINES/vv.dm | 3 ++ code/controllers/subsystem/persistence.dm | 5 +-- code/game/objects/structures/artstuff.dm | 42 +++++++++++++++++++++-- 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 4d740a7ba20..956106c7ec1 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -124,3 +124,6 @@ // misc #define VV_HK_SPACEVINE_PURGE "spacevine_purge" + +// paintings +#define VV_HK_REMOVE_PAINTING "remove_painting" diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index 226af527400..cc31e273a4f 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -19,6 +19,7 @@ SUBSYSTEM_DEF(persistence) var/list/picture_logging_information = list() var/list/obj/structure/sign/picture_frame/photo_frames var/list/obj/item/storage/photo_album/photo_albums + var/list/obj/structure/sign/painting/painting_frames var/list/paintings = list() /datum/controller/subsystem/persistence/Initialize() @@ -377,11 +378,11 @@ SUBSYSTEM_DEF(persistence) if(fexists(json_file)) paintings = json_decode(file2text(json_file)) - for(var/obj/structure/sign/painting/P in world) + for(var/obj/structure/sign/painting/P in painting_frames) P.load_persistent() /datum/controller/subsystem/persistence/proc/SavePaintings() - for(var/obj/structure/sign/painting/P in world) + for(var/obj/structure/sign/painting/P in painting_frames) P.save_persistent() var/json_file = file("data/paintings.json") diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm index b4d306dbe4a..8f120e3d309 100644 --- a/code/game/objects/structures/artstuff.dm +++ b/code/game/objects/structures/artstuff.dm @@ -50,6 +50,7 @@ var/used = FALSE var/painting_name //Painting name, this is set after framing. var/finalized = FALSE //Blocks edits + var/author_ckey var/icon_generated = FALSE var/icon/generated_icon @@ -123,6 +124,7 @@ /obj/item/canvas/proc/finalize(mob/user) finalized = TRUE + author_ckey = user.ckey generate_proper_overlay() try_rename(user) @@ -237,6 +239,7 @@ /obj/structure/sign/painting/Initialize(mapload, dir, building) . = ..() + SSpersistence.painting_frames += src AddComponent(/datum/component/art, 20) if(dir) setDir(dir) @@ -244,6 +247,10 @@ pixel_x = (dir & 3)? 0 : (dir == 4 ? -30 : 30) pixel_y = (dir & 3)? (dir ==1 ? -30 : 30) : 0 +/obj/structure/sign/painting/Destroy() + . = ..() + SSpersistence.painting_frames -= src + /obj/structure/sign/painting/attackby(obj/item/I, mob/user, params) if(!C && istype(I, /obj/item/canvas)) frame_canvas(user,I) @@ -305,6 +312,7 @@ return var/list/chosen = pick(SSpersistence.paintings[persistence_id]) var/title = chosen["title"] + var/author = chosen["ckey"] var/png = "data/paintings/[persistence_id]/[chosen["md5"]].png" if(!fexists(png)) stack_trace("Persistent painting [chosen["md5"]].png was not found in [persistence_id] directory.") @@ -323,6 +331,7 @@ new_canvas.icon_generated = TRUE new_canvas.finalized = TRUE new_canvas.painting_name = title + new_canvas.author_ckey = author C = new_canvas update_icon() @@ -345,15 +354,14 @@ var/result = rustg_dmi_create_png(png_path,"[C.width]","[C.height]",data) if(result) CRASH("Error saving persistent painting: [result]") - current += list(list("title" = C.painting_name , "md5" = md5)) + current += list(list("title" = C.painting_name , "md5" = md5, "ckey" = C.author_ckey)) SSpersistence.paintings[persistence_id] = current /obj/item/canvas/proc/fill_grid_from_icon(icon/I) - var/w = I.Width() + 1 var/h = I.Height() + 1 for(var/x in 1 to width) for(var/y in 1 to height) - grid[x][y] = I.GetPixel(w-x,h-y) + grid[x][y] = I.GetPixel(x,h-y) //Presets for art gallery mapping, for paintings to be shared across stations /obj/structure/sign/painting/library @@ -364,3 +372,31 @@ /obj/structure/sign/painting/library_private // keep your smut away from prying eyes, or non-librarians at least persistence_id = "library_private" + +/obj/structure/sign/painting/vv_get_dropdown() + . = ..() + VV_DROPDOWN_OPTION(VV_HK_REMOVE_PAINTING, "Remove Persistent Painting") + +/obj/structure/sign/painting/vv_do_topic(list/href_list) + . = ..() + if(href_list[VV_HK_REMOVE_PAINTING]) + if(!check_rights(NONE)) + return + var/mob/user = usr + if(!persistence_id || !C) + to_chat(user,"This is not a persistent painting.") + return + var/md5 = md5(C.get_data_string()) + var/author = C.author_ckey + var/list/current = SSpersistence.paintings[persistence_id] + if(current) + for(var/list/entry in current) + if(entry["md5"] == md5) + current -= entry + var/png = "data/paintings/[persistence_id]/[md5].png" + fdel(png) + for(var/obj/structure/sign/painting/P in SSpersistence.painting_frames) + if(P.C && md5(P.C.get_data_string()) == md5) + QDEL_NULL(P.C) + log_admin("[key_name(user)] has deleted a persistent painting made by [author].") + message_admins("[key_name_admin(user)] has deleted persistent painting made by [author].")