From bc16600070f707679818774d5fa0ff6a6c5fbd6c Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 10 Apr 2020 04:00:59 -0700 Subject: [PATCH] alternative way --- code/__DEFINES/storage.dm | 4 ++ code/_onclick/hud/screen_objects/storage.dm | 6 ++- code/datums/components/storage/ui.dm | 44 +++++++++++---------- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/code/__DEFINES/storage.dm b/code/__DEFINES/storage.dm index bdcb638666..b4240455fe 100644 --- a/code/__DEFINES/storage.dm +++ b/code/__DEFINES/storage.dm @@ -41,3 +41,7 @@ #define MINIMUM_PIXELS_PER_ITEM 6 /// Maximum number of objects that will be allowed to be displayed using the volumetric display system. Arbitrary number to prevent server lockups. #define MAXIMUM_VOLUMETRIC_ITEMS 256 +/// How much padding to give between items +#define VOLUMETRIC_STORAGE_ITEM_PADDING 1 +/// How much padding to give to edges +#define VOLUMETRIC_STORAGE_EDGE_PADDING 1 diff --git a/code/_onclick/hud/screen_objects/storage.dm b/code/_onclick/hud/screen_objects/storage.dm index 5b73d8721a..db287565f2 100644 --- a/code/_onclick/hud/screen_objects/storage.dm +++ b/code/_onclick/hud/screen_objects/storage.dm @@ -71,6 +71,7 @@ icon_state = "stored_continue" var/obj/screen/storage/stored_left/left var/obj/screen/storage/stored_right/right + var/pixel_size /obj/screen/storage/volumetric_box/center/Initialize(mapload, new_master, our_item) left = new(null, src, our_item) @@ -78,7 +79,7 @@ return ..() /obj/screen/storage/volumetric_box/center/Destroy() - QDEL_NULL(lefT) + QDEL_NULL(left) QDEL_NULL(right) return ..() @@ -89,6 +90,9 @@ * Sets the size of this box screen object and regenerates its left/right borders. This includes the actual border's size! */ /obj/screen/storage/volumetric_box/center/proc/set_pixel_size(pixels) + if(pixel_size == pixels) + return + pixel_size = pixels cut_overlays() //our icon size is 32 pixels. transform = matrix((pixels - (VOLUMETRIC_STORAGE_BOX_BORDER_SIZE * 2)) / VOLUMETRIC_STORAGE_BOX_ICON_SIZE, 0, 0, 0, 1, 0) diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm index 0d606a2f84..aa778c0054 100644 --- a/code/datums/components/storage/ui.dm +++ b/code/datums/components/storage/ui.dm @@ -81,14 +81,9 @@ // Generate ui_item_blocks for missing ones and render+orient. var/list/atom/contents = accessible_items() - - var/horizontal_pixels = maxcolumns * world.icon_size - // do the check for fallback for when someone has too much gamer gear - if((MINIMUM_PIXELS_PER_ITEM * length(contents)) > horizontal_pixels) - to_chat(user, "[parent] was showed to you in legacy mode due to your items overrunning the three row limit! Consider not carrying too much or bugging a maintainer to raise this limit!") - return orient2hud_legacy(user, maxcolumns) - // after this point we are sure we can somehow fit all items with 8 pixels or more into our one row. - + // our volume + var/our_volume = get_max_volume() + var/horizontal_pixels = (maxcolumns * world.icon_size) - (VOLUMETRIC_STORAGE_EDGE_PADDING * 2) // sigh loopmania time var/used = 0 // define outside for performance @@ -100,33 +95,41 @@ used += volume volume_by_item[I] = volume percentage_by_item[I] = volume / get_max_volume() - to_chat(world, "DEBUG: [I] volume [volume] percent [percentage_by_item[I]]") var/overrun = FALSE - if(used >= (horizontal_pixels + 4)) //2-4 pixel grace zone + if(used > our_volume) // congratulations we are now in overrun mode. everything will be crammed to minimum storage pixels. to_chat(user, "[parent] rendered in overrun mode due to more items inside than the maximum volume supports.") overrun = TRUE + // item padding + horizontal_pixels -= ((length(percentage_by_item) - 1) * VOLUMETRIC_STORAGE_ITEM_PADDING) + + // do the check for fallback for when someone has too much gamer gear + if((MINIMUM_PIXELS_PER_ITEM * length(percentage_by_item)) > horizontal_pixels) + to_chat(user, "[parent] was showed to you in legacy mode due to your items overrunning the three row limit! Consider not carrying too much or bugging a maintainer to raise this limit!") + return orient2hud_legacy(user, maxcolumns) + // after this point we are sure we can somehow fit all items with 8 pixels or more into our one row. + // define outside for marginal performance boost var/obj/item/I // start at this pixel from screen_start_x. - var/current_pixel = 0 + var/current_pixel = VOLUMETRIC_STORAGE_EDGE_PADDING LAZYINITLIST(ui_item_blocks) + for(var/i in percentage_by_item) I = i var/percent = percentage_by_item[I] if(!ui_item_blocks[I]) - ui_item_blocks[I] = new /obj/screen/storage/volumetric_box(null, src, I) - var/obj/screen/storage/volumetric_box/B = ui_item_blocks[I] - var/pixels_to_use = overrun? MINIMUM_PIXELS_PER_ITEM : max(MINIMUM_PIXELS_PER_ITEM, FLOOR(horizontal_pixels * percent, MINIMUM_PIXELS_PER_ITEM)) - to_chat(world, "DEBUG: [I] using [pixels_to_use] pixels out of [horizontal_pixels]") + ui_item_blocks[I] = new /obj/screen/storage/volumetric_box/center(null, src, I) + var/obj/screen/storage/volumetric_box/center/B = ui_item_blocks[I] + var/pixels_to_use = overrun? MINIMUM_PIXELS_PER_ITEM : max(MINIMUM_PIXELS_PER_ITEM, round(horizontal_pixels * percent, 1)) // now that we have pixels_to_use, place our thing and add it to the returned list. - B.screen_loc = I.screen_loc = "[screen_start_x]:[current_pixel + (pixels_to_use * 0.5)],[screen_start_y]:[screen_pixel_y]" + B.screen_loc = I.screen_loc = "[screen_start_x]:[current_pixel + (pixels_to_use * 0.5) + VOLUMETRIC_STORAGE_ITEM_PADDING],[screen_start_y]:[screen_pixel_y]" // add the used pixels to pixel after we place the object - current_pixel += pixels_to_use + current_pixel += pixels_to_use + VOLUMETRIC_STORAGE_ITEM_PADDING // set various things B.set_pixel_size(pixels_to_use) @@ -174,9 +177,10 @@ maxallowedscreensize = current_maxscreensize // we got screen size, register signal RegisterSignal(M, COMSIG_MOB_CLIENT_LOGOUT, .proc/on_logout, override = TRUE) - if(M.active_storage) - M.active_storage.ui_hide(M) - M.active_storage = src + if(M.active_storage != src) + if(M.active_storage) + M.active_storage.ui_hide(M) + M.active_storage = src LAZYOR(is_using, M) if(volumetric_ui()) //new volumetric ui bay-style